「なでしこv1」開発掲示板

なでしこv1のバグや要望を書き込む掲示板
[一覧へ] > (@811) [中] [解決]
@811■ (#2535) MD5/SHA1ファイル取得で正しくないハッシュ値が返る - wt (2016-02-14 18:01) /中 未処理
【症状】
MD5ファイル取得、SHA1ファイル取得で
1,452,161 KB (約 1.38 GB) 以上のファイルからハッシュ値を取得すると
「空からMD5取得 (SHA1取得)」した場合と同じ値を返す。

また、SHA1ファイル取得で 256 MB 以上のファイルからハッシュ値を取得すると、
他の処理系やチェックサムツールとは異なる値を返すことがある。

【再現方法】
ファイル = ファイル選択
MD5_A = ファイルからMD5ファイル取得
MD5_B = 空からMD5取得
SHA1_A = ファイルからSHA1ファイル取得
SHA1_B = 空からSHA1取得
「MD5
 ファイル: {MD5_A}
 空文字列: {MD5_B}」と表示
もし、MD5_A == MD5_Bならば、「 同じ値です」と表示
「SHA1
 ファイル: {SHA1_A}
 空文字列: {SHA1_B}」と表示
もし、SHA1_A == SHA1_Bならば、「 同じ値です」と表示

【要望】
正しいハッシュ値が取得できるように。

【バージョン】
1.555

【その他】
Windows 7 SP1 (64bit) 環境で確認しました。

(#2536) Re: MD5/SHA1ファイル取得で正しくないハッシュ値が返る - うぇいく (2016-02-15 22:33) /中 未処理
MD5とSHA1のどちらの場合でも、取得しようとしたファイル全体をマッピングしようとしていることを確認しました。そのため、Windowsのプロセス内でのアドレス空間の制限にひっかかってしまい、失敗しているようです(32bitsアプリでは、OS2G、アプリ2Gの計4Gのアドレス空間のなかでやりくりする)
(エラーにならず、空に対する値が返ってしまう。この辺は、他の命令でもエラーにならずに適当な値を返す命令は多く、この命令も同様のようです。)
1.5G前後のファイルサイズで空と等しい値が返るのはこれが原因のようです。
SHA-1の、256MB以上での原因はまだ不明です。

1.5G前後のファイル対策は行うとして、何らかのエラーの際には、エラーを発生させるか、空文字列を返す(空文字列のハッシュ値ではなく)ように変更するかの、いずれかがよさそうですね。

(#2537) Re: MD5/SHA1ファイル取得で正しくないハッシュ値が返る - wt (2016-02-18 00:51) /中 未処理
返信ありがとうございます。

ご指摘の通り、報告したケース以外でも
排他制御などで読み込みに失敗した場合は空文字列のハッシュ値が返ってきますね。
なでしこ側でエラーとしてもらえると助かります。

256 MB 以上のファイルで正しい値が返ってこない問題について、
ファイルの内容にかかわらず、特定のサイズであれば発生するようなので
1 GB までざっくり調べてみたのですが、
256 の倍数 MB を境に問題が起こったり、起こらなかったりが切り替わるようです。
(256 MB 以上では失敗するが、512 MB 以上では問題なく、
768 MB 以上でまた失敗するようになり、1024 MB だと問題ない)

(#2538) Re: MD5/SHA1ファイル取得で正しくないハッシュ値が返る - うぇいく (2016-02-18 13:11) /中 未処理
256MBごとに切り替わるということで分りました。

 内部で全体のバイト数を、ビット数に変換する処理(8倍する)ところで、桁上がりの処理に誤りがありました。
(標準の整数長より長いので、単なる数式ではなく、桁上がり等考慮したロジックで求めています。実際には、8回足すことで求めています。2つの値の足し算であれば、桁上がりするのは1しかないので処理が簡単になる。)

1:0000000032000000 ←正しい。
2:0000000064000000 ←正しい。
3:0000000196000000 ←桁上がりしているが、本当はまだ。なので値も正しくない。
4:00000001C8000000 ←値が正しくない。
5:00000001FA000000 ←値が正しくない。
6:000000012C000000 ←本来の桁上がりするタイミング。値も正しい。
7:000000015E000000 ←ここの値も正しい。
8:0000000290000000 ←2回目の桁上がりしているが、本当は未だ。また値が正しくない。

本当の答えは、0000000190000000。
上記のように、正しくなったり、不正になったりを繰り返します。これの周期が256MBとなるようです。
原因が絞り込めたので、折を見て修正します。

(#2575) Re: MD5/SHA1ファイル取得で正しくないハッシュ値が返る - うぇいく (2016-05-02 16:03) /中 未処理
とりあえず、自サイトの方にあげました。
よろしければ、お試しください。

http://weyk.la.coocan.jp/weyk/nadesiko/core.html

(#2576) 修正確認しました - wt (2016-05-03 19:06) /中 解決
ありがとうございます!
さっそく試したところ、すべて修正され正しい値が返ることが確認できました。
(手元では 10 GB を超えるファイルも問題なく処理できました)

次のリリースでパッチが取り込まれるかと思いますので、このスレッドは「解決」とします。

(#2535)へ返信する:

👆お手数ですが、いたずら防止のために、「真夏」の読み方を記入してください。

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能