掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ハッシュ値の計算について (ID:115985)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>使用目的は、サーバー/クライアントアプリケーション間でデーターの正当性をチェックするのに使用します。 >仮にも、35KBで区切り700MBのデーターを比較した場合 >2^20 * 700 / 35000 * 16 = 336KB >になる計算です(TT; やはり、そういった目的だと思ってましたが、…それなら >仮に0で埋めた20Byteのファイルのハッシュは[441018525208457705bf09a8ee3c1093]です >BufferSizeを10に設定し2度出力された[a63c90cc3684ad8b0a2176a6a8fe9005] >を計算によって20Byteのハッシュにする事が出来ますか? ができる必要はあるのでしょうか? POTETO さんの出した使用目的から必要な条件を考えると ・BufferSize の 10 に従って[a63c90cc3684ad8b0a2176a6a8fe9005]が2度出力されれば良い。 だけだと思います。…でその方法はもう、POTETO さんが知ってる知識の中にほとんどあります。 例えば、データの分割が『1行ごと』でも良いなら > While True > Application.DoEvents() > Readlen = fs.Read(Buffer, 0, Buffer.Length) > If Readlen = 0 Then Exit While > MD5Crypto.ComputeHash(Buffer, 0, Readlen) > End While > MsgBox(BitConverter.ToString(MD5Crypto.Hash).ToLower().Replace("-", "")) を While True Application.DoEvents() Readlen = fs.Read(Buffer, 0, Buffer.Length) If Readlen = 0 Then Exit While MD5Crypto.ComputeHash(Buffer, 0, Readlen) MsgBox(BitConverter.ToString(MD5Crypto.Hash).ToLower().Replace("-", "")) End While と変えるだけです。まぁ、Buffer を全て計算対象としてますので MD5Crypto.ComputeHash(Buffer, 0, Readlen) と MD5Crypto.ComputeHash(Buffer) は同じ意味になりますが、どちらでも特に問題は無いでしょう。 ただし、これでは1行ごとのデータの大きさにバラつきがあると非効率的だと思います。 ある行では 1Byte ある行では 336KB というの許されますから分割の目的と合って 無いでしょう(たぶん(汗))。最初の SHA1 のコードに戻りますが、バイト単位を指定する には例えばこんなコード…。 [VB.NET] Private Const FilePath As String = "c:\Test\Hash.txt" Public Sub SHA1(ByVal Block As Integer) Dim fs As System.IO.FileStream Try fs = New System.IO.FileStream(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read) Catch ex As Exception MsgBox(ex.ToString, MsgBoxStyle.Critical) Application.Exit() End Try Dim SHA1Crypto As New System.Security.Cryptography.SHA1CryptoServiceProvider Dim wByteLen As Long = fs.Length Dim r As New IO.BinaryReader(fs) Dim wBuffer() As Byte Dim wCountMax As Integer = wByteLen \ Block Dim wMod As Integer = wByteLen Mod Block Dim i As Integer For i = 0 To wCountMax - 1 ' 指定バイト数だけ読み込みます wBuffer = r.ReadBytes(Block) SHA1Crypto.ComputeHash(wBuffer) ', i * Block, Block) Debug.WriteLine(BitConverter.ToString(SHA1Crypto.Hash).ToLower().Replace("-", "")) Next If wMod <> 0 Then wBuffer = r.ReadBytes(wMod) SHA1Crypto.ComputeHash(wBuffer) ', i * Block, wMod) Debug.WriteLine(BitConverter.ToString(SHA1Crypto.Hash).ToLower().Replace("-", "")) End If End Sub Dim wBuffer() As Byte の中に一度、全てのデータを入れてしまう場合は SHA1Crypto.ComputeHash(wBuffer, i * Block, Block) のように指定部分だけの計算をする方法もあります。SHA1Crypto.Hash では最後に計算 されたハッシュ値が出力されるようです。動作確認してみて下さい。 [VB.NET]MD5 の例 Public Sub MD5(ByVal Buffer() As Byte, ByVal Block As Integer) Dim MD5Crypto As New System.Security.Cryptography.MD5CryptoServiceProvider Dim wLen As Integer = Buffer.Length Dim wCountMax As Integer = wLen \ Block Dim wMod As Integer = wLen Mod Block Dim i As Integer For i = 0 To wCountMax - 1 MD5Crypto.ComputeHash(Buffer, i * Block, Block) Debug.WriteLine(BitConverter.ToString(MD5Crypto.Hash).ToLower().Replace("-", "")) Next If wMod <> 0 Then MD5Crypto.ComputeHash(Buffer, i * Block, wMod) Debug.WriteLine(BitConverter.ToString(MD5Crypto.Hash).ToLower().Replace("-", "")) End If End Sub 以下、イマイチ何が問題なのか伝わらなかった文です。上に書いた解答で問題あるなら 問題点を上げて下さい。問題ないなら特に回答する必要はありません。いきなり[解決] して下さっても結構です。 >バッファを増やせば良いだけの話ですが冗長な事にかわりませんし、 変数の Buffer ? Buffer1、Buffer2、…ってのが必要な処理ですか???必要なんですか? 理解できません。 >もちろん336KBの文字列からハッシュを求めれば16Byteで済みますが >これはデーターのハッシュ値とは程遠いもので後に再利用しにくいもの >になってしまいます。。。 日本語として矛盾してませんか?。というかハッシュ値に関しての認識がボクと違う気がします。 336KB の文字列からハッシュ値を求めてもハッシュ値はハッシュ値だと思ってましたが?。 もともとハッシュ関数自体が情報量を少なくして比較する方法ですから 35KB から求めた ハッシュ値でも信用できないと言うことは出来ます。十分な『ばらつき』が起こるハッシュ関数を 利用することを前提としても、16Byte であらわす事のできるデータはもちろん 16Byte のみ。 2 ^ (16 * 8(bit))種類しか無いわけですから、それ以上の種類のデータを用意すれば 必ず同じハッシュ値を持つデータが存在しないとおかしいですよね? 変換前データに対応して1:1で計算されるものではありません(だからこそ不可逆) 変換前データが同じであれば同じハッシュ値が得られる事が保証されています この違いは分かっておられますか? >仰る通りです。私はMD5のアルゴリズムに関する知識は皆無に近いですが 既存の関数を利用しているうちは、具体的なアルゴリズムについてまで知っておく必要は 無いと思いますし、ボクも知りませんw(というかハッシュ関数自体詳しくないですが)。 が、ハッシュ関数がどういった面で何故有効なのか?は…ご存知なんですよね?。 どうも >これはデーターのハッシュ値とは程遠いもので という表現がボクには違和感があるんですが…?。例えば 35KB の分割単位にしても… …極端な話 >データーの正当性をチェックする だけなら…理論を読む限りでは 336KB の文字列から 16Byte のハッシュ値を求めても 十分に機能しそうなんです。特に人間がデータの修正をするのであれば。データの作成も コンピュータが行ってデータの変化が 1Byte 単位で1日に 2 ^ 10 ファイルくらいの 出力で起こってます…とか言われたら困るんでしょうけど。その辺りをテストして必要性 が分かった上での 35KB ならいいんですが…。分割する有効性もいくつかあるでしょうが、 今の POTETO さんが必要としてるのか?必要なのか?発言を聞いてる限りピンと来ないです。 はっきり確認しておきますが、ボクはハッシュ関数に関しては素人ですよ?その素人が ちょっと調べて…分かるくらいの知識は当然持っていると判断して回答しますからね?。 多分ボクがハッシュ関数に対して素人だから POTETO さんの要求を十二分に理解できない のでしょう。 その辺りのフォローは POTETO さんの方でお願いしますね?。 今回、SHA1 と MD5 のソースが混在してます。相違点に注意してください。 SHA1 アルゴリズムのハッシュ サイズは 160bit (20Byte) です。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.