- ベストアンサー
SHA1ハッシュの生成結果が異なる理由とは
Windows で Digest::SHA1 というモジュールを使って 文字列のSHA1ハッシュを生成するプログラムを作ったのですが、 $x = <STDIN>; と書き、100 と入力して生成したハッシュと、 あらかじめ $x = 100; のように設定しておいて生成したハッシュとでは、内容が異なっています。 前者は 310b86......、後者は 6a2903...... と出ます。 これはなぜでしょうか? 一致させるにはどうすれば良いのでしょうか。 ご教示ください。よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
$x = <STDIN> で、$xに代入される値は改行が末尾に含まれるためです。 chompで改行を除去しましょう。 $x = 100; print Digest::SHA1::sha1_hex($x) . "\n"; $data = <STDIN>; chomp($x); print Digest::SHA1::sha1_hex($x) . "\n";
その他の回答 (2)
- W_H
- ベストアンサー率47% (21/44)
日本語に限らず、文字入力の決定とか終了の命令を送れるのがエンターキーですが、これは、目には直接見えない[改行]という記号をパソコンに送っています。 これに、ただ決定と言う意味をパソコンが持たせているだけで、本質は改行の記号です。(これからは改行=\nと表記) なので、単純に[100]と入力しても、パソコンが認識するのは、[100\n]となります。 どんなデータにもいえますが、直接データを入力すると、末尾に\nが入ります。 意外にこれを知らないと、プログラミングに多大な影響が出るケースもあります。 \nを消す有効な関数はxpectorさんが書いているので、数字の改行を取り除く方法を書いておきます。 $x+=0; これを入力処理の後に入れてください。数字の場合、計算すれば\nは消えます。数字に影響がないように、0を足しています。
お礼
大変勉強になりました。 ご回答ありがとうございます。
- himajin100000
- ベストアンサー率54% (1660/3060)
# OO style use Digest::SHA1; my $Digest1; my $Digest1Arg; my $Digest2; my $Digest2Arg; my $Digest3; my $Digest3Arg; my $Digest4; my $Digest4Arg; $Digest1 = Digest::SHA1->new; $Digest1Arg = 100; $Digest1->add($Digest1Arg); print $Digest1->hexdigest; print "\n"; $Digest2 = Digest::SHA1->new; $Digest2Arg = "100"; $Digest2->add($Digest2Arg); print $Digest2->hexdigest; print "\n"; $Digest3 = Digest::SHA1->new; $Digest3Arg = <STDIN>; $Digest3->add($Digest3Arg); print $Digest3->hexdigest; print "\n"; $Digest4 = Digest::SHA1->new; $Digest4Arg = <STDIN>; chomp($Digest4Arg); $Digest4->add($Digest4Arg); print $Digest4->hexdigest; print "\n"; ===== perl Q3189946-1.pl 310b86e0b62b828562fc91c7be5380a992b2786a 310b86e0b62b828562fc91c7be5380a992b2786a 100 6a2903b37751bca2bb4e3ee462092fa957d6cd35 100 310b86e0b62b828562fc91c7be5380a992b2786a
お礼
ご回答ありがとうございます。 私は素人なので少々分からないところもあるのですが、 とりあえず試してみます。
お礼
ご回答ありがとうございます。 改行の有無だったのですか。納得しました。 chompという関数も初めて知りました。 試してみます。