どなたか教えて下さい。
仕事でデータのハッシュ値を求める必要がありまして、質問致します。
ハッシュ値はマイクロソフトが提供しているfciv.exeというソフトを使い、希望のファイルのハッシュ値が、正しいことを確認しました。(正しいのは当たり前でしょうが・・・)
多少perlの知識がありましたので、perlで他の方のHPを参考にしながら、ハッシュ値を計算したところ、fcivと異なってしまって、誤った値が出ます。
何がおかしいのでしょうか?
作成したperlプログラム↓
use strict;
use Digest::SHA1 qw(sha1_hex);
open (INFILE,">c:\a_test.txt");
my %file = <INFILE>;
print sha1_hex(%file),"\n";
close(INFILE);
ちなみに開くファイルに指定したa_test.txtにはSHIFT_JISで「A」を40個入れてみました。
FCIVでは、a_test.txtの回答が5cdbb...で上記perlプログラムだとda39a3...になります。
ちなみに、a_testと名前を変え、バイナリーデータも同じように作成しましたが、
FCIVでは、回答が、5efef....上記perlプログラムではda39a3...となり、perlプログラムの方ではバイナリとテキストが同じ値になってしまいます。
ハッシュ値をよく理解してないことに問題があるのは承知ですが、どなたかプログラムの修正、ご指導宜しくお願いします。
No.3ベストアンサー
- 回答日時:
ある程度時間がかかるのはしかたないです。
ハッシュを計算するのに全データを読む必要がありますから。また、今の方法は一旦ファイルの全データをPerlの変数の収めてからハッシュの計算をしているので、大きなファイルだとたしかにメモリがたりなくなる場合があるでしょう。
こちらでメモリオーバーになるようなファイルがなかったので確認はとってませんが、次の方法はどうでしょうか。
use strict;
use Digest::SHA1 ;
open (OUTFILE,">c:\\hash.txt")|| die Fileが~";
open (INFILE,"c:\\1.m2ts")|| die "Fileが~";
binmode(INFILE);
my $hash = Digest::SHA1->new->addfile(*INFILE)->hexdigest ;
close(INFILE);
print OUTFILE $hash ;
print $hash ;
close(OUTFILE);
おおお!色々ファイルを試したところ、凄く調子イイです。
不思議な構文ですね。
勉強していきたいと思います。
ありがとうございました。
No.2
- 回答日時:
> open (INFILE,">c:\a_test.txt");
これだと、a_test.txtへ出力になりますよ。
そのためにINFILEが「出力用」になっていて
> my %file = <INFILE>;
で%fileに入力できていません。
da39a3...はおそらく「長さ0のデータに対するSHA1ハッシュ」です。
こちらで長さ0のファイルを作ったところ、
da39a3ee5e6b4b0d3255bfef95601890afd80709
になりました。
use strict;
use Digest::SHA1 qw(sha1_hex);
#>を取って入力に。""の中に\を書くときは\\とエスケープするのを忘れずに
#また、エラー処理も忘れずに。
open (INFILE,"c:\\a_test.txt") || die "Fileが開けない";
# ハッシュ(%)とリスト(@)は区別しましょう。
# %でも動いてしまうのがPerlという言語なのだが。
my @file = <INFILE>;
print sha1_hex(@file),"\n";
close(INFILE);
返答ありがとうございました。ヘンなところを誤っていたようで、お恥ずかしい限りです。
理解できました。大変感謝しております。
更にですが、これに加えてもう一点だけご指導願えませんでしょうか?
前回ご指導頂いた部分を直し、改良して以下のようになりました。
use strict;
use Digest::SHA1 qw(sha1_hex);
open (INFILE,"c:\\1.m2ts")|| die "Fileが~";
binmode(INFILE);
open (OUTFILE,">c:\\hash.txt")|| die Fileが~";
while (my @file = <INFILE>) {
print OUTFILE sha1_hex(@file);
print sha1_hex(@file);
}
close(OUTFILE);
close(INFILE);
で、動作確認できました。
実は上記のように画面表示とファイル出力を加えたかったのです。(これがやりたくて前回”>”を間違えてました)
ここからが問題ですが、
今回の対象とした「1.m2ts」(参考動画)は600MBでして、このハッシュ値を出すとやけに時間がかかる(数分)のですが、仕方がないのでしょうか?
何故問題としているかと申しますと、会社のデータはGB単位なんです。
会社のパソコンで試験したところ、遅いどころか、時間がかかったあげく「OUT OF MEMORY」と表示が出てしまいます。
一気に読み込むと問題があるかと思い「while」を使ってみましたが、変わらないような気もしますし、良案があったら教えて頂きたく思います。
宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl Windows10においての『Perl』のプログラムについて 1 2022/05/09 16:04
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- その他(コンピューター・テクノロジー) なぜデータの整合性を確認する時はハッシュ値で確認するのでしょうか?ハッシュ値は衝突する可能性があるの 5 2023/07/05 20:38
- その他(コンピューター・テクノロジー) exFATの外付けSSDからパソコンのNTFSの内蔵ストレージにコピーした場合はコピーしたデータのハ 2 2023/08/09 19:51
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Visual Basic(VBA) セルの値からファイルを複数作りたい2 3 2022/10/07 15:54
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- JavaScript [再掲]指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードについて 1 2023/05/10 15:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「パスが見つかりません」とい...
-
perlで先頭の数値をみて昇順に...
-
日本語のマッチング(正規表現)
-
一行だけ読込
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルを途中行まで...
-
window.open でのファイル指定方法
-
ReadLineでの読み出し行を指定する
-
dos変数の%~dp0は powershellで...
-
openした後、closeしないでプロ...
-
perlで複数行のデータを自由に...
-
sprintfについて
-
microsoft multimedia control ...
-
改行コードが勝手に
-
ADOによるCSVファイルからのデ...
-
fopenでディレクトリ内の全ファ...
-
Windowsで複数のファイルを同じ...
-
htaccessで特定のディレクトリ...
-
バッチファイルの作り方(CSV→...
-
VBA テキストファイルを読み取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル名を複数個配列で確保...
-
Pythonでegrep機能をつかいたい
-
Fortranで1行飛ばして読み込む方法
-
テキストファイルの各行を配列...
-
C++でのテキストファイル読み込...
-
C言語初心者です。プログラミン...
-
ファイルの内容をスカラー変数...
-
shellのコマンド deffの差分の...
-
<>で区切られたdatファイルをエ...
-
ifstream/ofstream について
-
perlの引数で複数のファイル処...
-
Pythonでテキストを行数指定し...
-
Perl エラーログを指定の場所...
-
perlでCSVをソートする方法につ...
-
「パスが見つかりません」とい...
-
ファイル名に日付を入れてアッ...
-
文字列操作に関する質問です。
-
連番のファイルを何個も開きたい
-
perlでIEのクッキーを削除したい
-
MATLABでカーブフィットしたデ...
おすすめ情報