ハッシュ値の計算について


POTETO  2004-08-29 11:15:36  No: 115964

初めまして、今バイナリファイルのハッシュ値を求めるソフトを作っているのですが、
お尋ねしたいことがあります。以下のコードを書いたのですが・・・

FilePath = HOGE

  Public Sub SHA1()
    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 Hash() As Byte = SHA1Crypto.ComputeHash(fs)
    strResult = BitConverter.ToString(Hash).ToLower().Replace("-", "")     '整形し結果を返す
  End Sub

しかし、SHA1CryptoServiceProviderに低水準な操作が出来るようなものが見当たらないため
進行状態取得・中断ができないものが出来てしまいました。

どうにかVB.NETだけで処理中の情報取得が実現できないものでしょうか?
お願いします。(VS.NET 2003


特攻隊長まるるう  2004-09-01 02:24:30  No: 115965

処理中の情報取得は分からないんですが、
>進行状態取得・中断
がなぜ必要か?…と考えると、進行状況を表示できるくらい
計算に時間のかかる大きなファイルを取り扱っている…と想像
して…レベル0でもできてしまうコーディングは対象データを
分割してしまう…でしょう。
分割データのループ処理なら進行状態はループのカウンタ。
中断もループから抜ければいいだけですし…。


POTETO  2004-09-01 09:52:18  No: 115966

返信ありがとうございます。
>>分割してしまう
それが出来なくて困っているのですが。。。

        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("-", ""))

こんなコードも書きましたが最後に取得したBufferの内容分のハッシュが算出されてしまいます。
やり方が悪いのでしょうか?


マグ  2004-09-01 17:28:28  No: 115967

Dim flag as integer
flag=0
While True
            Application.DoEvents()
            Readlen = fs.Read(Buffer, 0, Buffer.Length)
            If Readlen = 0 Then
                flag=0
                Exit While
            End If
            MD5Crypto.ComputeHash(Buffer, 0, Readlen)
                flag=1
        End While
If flag=1 Then
        MsgBox(BitConverter.ToString(MD5Crypto.Hash).ToLower().Replace("-", ""))
End If

ちなみに未確認です。


マグ  2004-09-01 17:30:26  No: 115968

すみません。

文章を読み間違えました。


特攻隊長まるるう  2004-09-01 20:04:28  No: 115969

>こんなコードも書きましたが最後に取得したBufferの内容分のハッシュが算出されてしまいます。
>やり方が悪いのでしょうか?
やり方が悪いというか…そーゆー動作をコーディングした
プログラムだからじゃないんですか?(^^;)
計算対象となる Buffer の内容を
            Readlen = fs.Read(Buffer, 0, Buffer.Length)
のたびに上書きしているんでしょ?
MD5Crypto に過去に計算したハッシュ値を溜め込むような機能が無いと
当然の結果だと思いますが?。


とおりすがり  2004-09-01 21:41:46  No: 115970

>マグさん
未確認のソースを提示するのはとても不親切だと思います。
少なくとも一度は自分で確認してみてください。
もし自分が未確認のソースを提示された場合のことを考えてみてください。
自分がされて嫌な事は他人にもしないというのは常識だと思うのですが…


葉月  2004-09-01 22:41:50  No: 115971

>POTETOさん
私VB.NETの知識はないですけど
ループでまわして長さ0でブレイクしてEXITしてるようなので
その間をステップで実行し、なぜその値が入っているのかを見てみてはいかがでしょうか?
もしくは紙にその処理を図示(フローでも可)し、何が格納されてるのかを確認してみては?

両者画面でやるか机上でやるかの違いですが、何か間違っていたら気づくと思いますよ
それがデバッグなわけですし・・・
それを行ってから結果が得られない!わからない!と言っているなら
見当違いレスすんません


マグ  2004-09-02 01:26:16  No: 115972

>未確認のソースを提示するのはとても不親切だと思います。
>少なくとも一度は自分で確認してみてください。

分かりました。


とおりすがり  2004-09-02 03:41:51  No: 115973

POTETOさん、特攻隊長まるるうさん、葉月さん、その他多くの方には申し訳ないのですが、あまりにも癇にさわったので…

>マグさん
では何が分かったのか教えていただけませんか?
あなたの過去の発言を見る限りでは、どうしてもその場しのぎのようにしか聞こえません。

>マグ 2004/09/01(水) 16:26:16
>>未確認のソースを提示するのはとても不親切だと思います。
>>少なくとも一度は自分で確認してみてください。

>分かりました。

このレスでは、とても分かっているようには思えません。
むしろ、喧嘩を売られているように聞こえます。
質問する時も、質問に答える時も、誠実さが感じられません。
本当に反省しているならこういったことが繰り返される事はないと思うのですが…
その辺りはどう考えていらっしゃるのでしょうか?
是非とも教えていただきたいです。


  2004-09-02 03:47:15  No: 115974

>本当に反省しているならこういったことが繰り返される事はないと思うのですが…

たぶん、これ以上いってもしょうがないかなと思いますので、
レスつけず、少し静かにしたほうがいいのかなと個人的には思いますね。


特攻隊長まるるう  2004-09-02 03:47:25  No: 115975

いや、まぁ…質問者の方に一番申し訳ないですが…変かもしれませんが他スレッドで
話した方が…。


POTETO  2004-09-02 05:07:58  No: 115976

いつの間にこんなにレスがあると思ったら・・・(^^;;;
このまま質問を続けて宜しいでしょうか?笑

>>やり方が悪いというか…そーゆー動作をコーディングした
>>プログラムだからじゃないんですか?(^^;)
仰る通りです。私はMD5のアルゴリズムに関する知識は皆無に近いですが
内部的に計算過程を保持しておく必要がある事が分かります。

>分割データのループ処理なら進行状態はループのカウンタ。
>中断もループから抜ければいいだけですし…。
ということを聞き、インスタンスを作成し.ComputeHashにBufferを与え続け、
最終的に.Hashでトータルのハッシュが算出されると思い込んでしまいました。
結果、POTETO 2004/09/01(水) 00:52:18のレスに至った訳です。

どうでしょう?ハッシュ値を求めるには全てのバイト配列を与えるもしくは、ストリームを渡すしか無いのでしょうか?
仮に0で埋めた20Byteのファイルのハッシュは[441018525208457705bf09a8ee3c1093]です
BufferSizeを10に設定し2度出力された[a63c90cc3684ad8b0a2176a6a8fe9005]
を計算によって20Byteのハッシュにする事が出来ますか?


マグ  2004-09-02 17:43:57  No: 115977

>本当に反省しているならこういったことが繰り返される事はないと思うのですが…
>その辺りはどう考えていらっしゃるのでしょうか?
>是非とも教えていただきたいです。

普段はソースを確認しています。

しかし、このときのレスでは、確認する時間がなくって、
未確認になってしまった上、急いで質問文章を読んでしまい、
質問内容を読み間違えたりしてしまいました。
その上、急いで、プログラムを作ってしまいましたから、
結果、流れが意味ないようなプログラムになってしまいました。
そして、送信した後にぜんぜん違うということに気がついて、

すみませんっというレスを続けたんです。


スレとは関係ないのですが…  2004-09-02 19:01:51  No: 115978

>しかし、このときのレスでは、確認する時間がなくって、
>未確認になってしまった上、急いで質問文章を読んでしまい、
>質問内容を読み間違えたりしてしまいました。

マグさんの回答しようとする姿勢は、質問者にとってはありがたいことです。
しかし、回答が見当違いであったり、未確認ソースを公開したりすると、
質問者はかえって混乱する場合があるでしょう。

その点を踏まえると、マグさんの回答は少し不親切に思えます。
忙しいのであれば回答しなければいいだけの話。
マグさんに回答の義務はないのです。

もう少し相手のことを思いやった返答を心がけて欲しいと思います。


マグ  2004-09-02 20:15:52  No: 115979

分かりました。

今後、時間がない時は
無理にレスをしたりしません。


POTETO  2004-09-02 21:00:31  No: 115980

あっ!  途中からMD5になってました・・・


特攻隊長まるるう  2004-09-03 00:11:07  No: 115981

>あっ!  途中からMD5になってました・・・
それは承知してます。ただ、[VB.NET]では System.Security.Cryptography.HashAlgorithm
の派生クラスとなってますのでインターフェースは同じです。必要なものに
読み替えれば特に問題ないでしょう。

>どうでしょう?ハッシュ値を求めるには全てのバイト配列を与えるもしくは、ストリームを渡すしか無いのでしょうか?
>仮に0で埋めた20Byteのファイルのハッシュは[441018525208457705bf09a8ee3c1093]です
>BufferSizeを10に設定し2度出力された[a63c90cc3684ad8b0a2176a6a8fe9005]
>を計算によって20Byteのハッシュにする事が出来ますか?
あ〜。そっちに話がいっちゃうとボクも分かりません。ごめんなさい。
もう少し上級者の集まる掲示板で聞いて下さい。
…まぁ、出来ないと思います。不可逆な一方向関数で計算されるわけですし、
演算前の文字列をつなげればデータが繋がるみたいな法則性はハッシュ値
同士には無いはずです。
ファイルの比較であるなら、分割したデータ毎のハッシュ値の比較で
できると思って書込みしたわけですが、実際やってみるとストリームを
丸ごと渡してもパフォーマンスがそれほど落ちないので意味が無いのかも…(汗)

今更ですけど、どのような目的にご使用になるのでしょうか?
進行状態取得・中断が必要な理由とそれをどのように利用するかを教えていただけますか?。


葉月  2004-09-03 17:56:42  No: 115982

ハッシュとはどう使うのかすら知らなかったので調べてみました
POTETOさんの目的がはっきりしていないので調べたものを記述しますね

ハッシュということより正当性のチェックを主に行う
元のデータを種に疑似乱数を発生させる
その文字列がもとのデータと一致するかをチェックする
この時の乱数とは不可逆である

ということより戻すことは不可能で
分割したハッシュ値を全て比較するなりという方法になるのでしょうかね?
当たり前のことしか書いていませんが
当たり前のことしかできないのが機械ですね(^^;

少なくとも0が20個の羅列と
0が10個の羅列が二つの相関は無いですね


POTETO  2004-09-04 07:31:11  No: 115983

使用目的は、サーバー/クライアントアプリケーション間でデーターの正当性をチェックするのに使用します。
仮にも、35KBで区切り700MBのデーターを比較した場合
2^20 * 700 / 35000 * 16 = 336KB
になる計算です(TT;

バッファを増やせば良いだけの話ですが冗長な事にかわりませんし、
もちろん336KBの文字列からハッシュを求めれば16Byteで済みますが
これはデーターのハッシュ値とは程遠いもので後に再利用しにくいもの
になってしまいます。。。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlr
この辺りを見る限り可能そうなのですが、力不足です・・・もうちょっと調べてみます。


POTETO  URL  2004-09-04 07:32:25  No: 115984

すみませんリンクミスです。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemsecuritycryptographyhashalgorithmclasshashcoretopic.asp


特攻隊長まるるう  2004-09-06 23:50:08  No: 115985

>使用目的は、サーバー/クライアントアプリケーション間でデーターの正当性をチェックするのに使用します。
>仮にも、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) です。


POTETO  2004-09-07 11:51:31  No: 115986

すみません貴重な時間を割いていただいて・・・

>>ができる必要はあるのでしょうか?
これに関しては出来ないはずです、ただスレッドの流れから「出来るの!?」と思い書き込みました。

>例えば、データの分割が『1行ごと』でも良いなら
>は同じ意味になりますが、どちらでも特に問題は無いでしょう。
>これでは1行ごとのデータの大きさにバラつきがあると非効率的だと思います。
この辺の意味が分かりません、以下は"例えばこんなコード…"と提示されたものと機能は変わりませんが・・・
>********************************************************************************
    Private Const BufferSize As Integer = 1024 * 35

    Public Function MD5(ByVal FilePath As String) As String
        Dim fs As System.IO.FileStream
        Dim Readlen As Integer
        Dim Buffer(BufferSize - 1) As Byte
        Dim MD5Crypto As New System.Security.Cryptography.MD5CryptoServiceProvider

        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

        While True
            Application.DoEvents()
            Readlen = fs.Read(Buffer, 0, Buffer.Length)
            If Readlen = 0 Then Exit While
            MD5Crypto.ComputeHash(Buffer, 0, Readlen)
            Debug.WriteLine(BitConverter.ToString(MD5Crypto.Hash).ToLower().Replace("-", ""))
        End While
    End Function
>********************************************************************************

SHA/MD5のサンプルを書いて頂いたのですが、それぞれDebug.WriteLineによって書かれたハッシュ値(文字列)らは合計でどの位のデーター量になりますか?
//仮にも、35KBで区切り700MBのデーターを比較した場合
//2^20(1MB) * 700(Data) / 35000(Buffer) * 16(Hash[Byte]) = 336KB
と書いたように膨大な量になるはずです。そこでバッファサイズ(BlockSize)を仮に2倍にすれば(336/2)KBのデーター量になります。
>バッファを増やせば良いだけの話ですが冗長な事にかわりませんし、
そこで上記の発言がでました。

>336KB の文字列からハッシュ値を求めてもハッシュ値はハッシュ値だと思ってましたが?。
その通りですが、その336KB の文字列から求めたハッシュ値は何のハッシュ値なのかを理解して下さい。
オリジナルデーターのハッシュ値ではなく、336KBの意味のない英数字の並びのハッシュ値です。
>理論を読む限りでは 336KB の文字列から 16Byte のハッシュ値を求めても
十分に機能しそうなんです。
機能します。私はハッシュ関数のコリジョンについては許容範囲として無視しています
336KB の文字列から 16Byte のハッシュ値を求めればそれはオリジナルデータの間接的なハッシュ値として十分使えると考えます。
しかしそこで得られたハッシュ値は何度もいうようにファイルのハッシュ値ではありません。
一般的なハッシュ取得ソフトと互換性はないですよね?


特攻隊長まるるう  2004-09-09 03:17:59  No: 115987

>しかしそこで得られたハッシュ値は何度もいうようにファイルのハッシュ値ではありません。
>一般的なハッシュ取得ソフトと互換性はないですよね?
ハッシュ関数の『一般的』という認識がボクとは全く違いました。
ボクにとって『ファイルのハッシュ値』という表現に一番近いのは
>336KBの意味のない英数字の並びのハッシュ値
の方ですから。…が、まぁ、POTETO さんの要求が一般的なのかそうでないのかがボクに
理解できなくても、ボクはハッシュ関数に関してのベテランではありませんので、
最初から、コーディングの手法として考えられるパターンをいくつか示しているだけ
です。認識の違いは結果に影響を与えていないと思いますので、問題は無いはずです。
必要な部分だけ抜き出していただけたらと思います。

>>例えば、データの分割が『1行ごと』でも良いなら
>>は同じ意味になりますが、どちらでも特に問題は無いでしょう。
>>これでは1行ごとのデータの大きさにバラつきがあると非効率的だと思います。
>この辺の意味が分かりません
>
>>例えば、データの分割が『1行ごと』でも良いなら
思いきり FileSystemObject と間違ってますね。間違いです。しかも FileSystemObject
なら .ReadLine ですから全く違います。別のオブジェクトで『1行ごと』に読む関数があるんです。
それを使っていると勘違いしてました。『なんかメソッドの書き方違うような気がするなぁ』
…とは思ってたのに、[VB6.0]時代のオブジェクトなので『書き方が変わったんだろう』
くらいにしか思わず、違うオブジェクトだと全然気づきませんでした。バカです。
>>は同じ意味になりますが、どちらでも特に問題は無いでしょう。
これは…特に解説がいるようにも思いませんが…
   MD5Crypto.ComputeHash(Buffer, 0, Buffer.Length)

   MD5Crypto.ComputeHash(Buffer)
が同じ動きをします。という事です。ただ、最後の1回が Buffer.Length
じゃだめのようですね。これは前述の FileSystemObject との勘違いが
影響してまして、『1行ごと』読み込めるという事から分かると思いますが、
読み込んだテキストのデータが戻り値となるので余分なスペースは考えて
いません。ってゆーか戻り値は String 型です。なんで気付かないのでしょう?
謎です。FileStream.Read の引数に与えた Buffer のサイズは変わらない
ようですので、読み取られた合計文字数である戻り値の利用は必要です。
>>これでは1行ごとのデータの大きさにバラつきがあると非効率的だと思います。
これも…1行ごとにデータが読み取れないと意味不明です。当然です。
無視して下さい。

結局、ループを抜けて最後に計算されたハッシュ値のみ出力してたのを
ループの中で計算した時点で毎回出力すればいい…と。それだけの修正で
良かったという結論になってしまいました。結果として得られる出力は、
『ファイルのデータを指定バイト数ずつ読み込んだ時、それぞれのデータの
ハッシュ値を求め、それを羅列したもの』…となりました。
これは POTETO さんの要求を満たしていますか?。
満たしているなら最初の質問に戻って、ループのカウンタが進行状況。
中断はフラグでも用意してループの中でフラグを確認してフラグが立っていたら
ループを抜ける…で1つのパターンとして実現できそうです。

都合が悪い部分がありましたら質問を続けて下さい。


CAQ(とおりすがり)  2004-09-29 00:40:18  No: 115988

SHA-1の検索結果から飛んできたのですが、
>しかしそこで得られたハッシュ値は何度もいうようにファイルのハッシュ値ではありません。
>一般的なハッシュ取得ソフトと互換性はないですよね?
が気になったので多少突っ込みを。

SHA-1なんかのハッシュ関数は、あたえるデータが1bit違っていても違うハッシュ値を吐き出します。ファイルのSHA-1ハッシュ値を他のソフトで計算した結果と同じにしたいのであれば、SHA1CryptoServiceProviderを使っている限り途中の状況を取得したり、中断したりはできません。

http://www.ipa.go.jp/security/rfc/RFC3174JA.html
仕様書は煩雑かもしれませんが、Cのソースが置いてあるのでこれを参考にしながらご自身で実装なさるのが一番の近道かと。

…でもまあ解決されたみたいだし関係ないかなぁ


ガッ  2004-09-29 05:10:26  No: 115989

ん、割り込みすまないが。

1  まず、100MBのデータを5MBずつ区切り、各々のハッシュ値を計算し、配列hash1()に格納して置く。
2  そのあとにhash()のハッシュ値を計算する。
これで事実上、元のデータのハッシュ値を計算したことになる。
で、いいんでは?

…もしかしたら、自力でハッシュ関数をつくって、中にコードを埋め込んだほうが楽かも(дll


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加