幼稚園時代「何組」でしたか?

Windows で Digest::SHA1 というモジュールを使って
文字列のSHA1ハッシュを生成するプログラムを作ったのですが、

$x = <STDIN>;

と書き、100 と入力して生成したハッシュと、
あらかじめ

$x = 100;

のように設定しておいて生成したハッシュとでは、内容が異なっています。
前者は 310b86......、後者は 6a2903...... と出ます。

これはなぜでしょうか?
一致させるにはどうすれば良いのでしょうか。
ご教示ください。よろしくお願いいたします。

A 回答 (3件)

# 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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
私は素人なので少々分からないところもあるのですが、
とりあえず試してみます。

お礼日時:2007/07/27 16:51

$x = <STDIN> で、$xに代入される値は改行が末尾に含まれるためです。


chompで改行を除去しましょう。

$x = 100;
print Digest::SHA1::sha1_hex($x) . "\n";

$data = <STDIN>;
chomp($x);
print Digest::SHA1::sha1_hex($x) . "\n";
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
改行の有無だったのですか。納得しました。
chompという関数も初めて知りました。
試してみます。

お礼日時:2007/07/27 16:54

日本語に限らず、文字入力の決定とか終了の命令を送れるのがエンターキーですが、これは、目には直接見えない[改行]という記号をパソコンに送っています。


これに、ただ決定と言う意味をパソコンが持たせているだけで、本質は改行の記号です。(これからは改行=\nと表記)
なので、単純に[100]と入力しても、パソコンが認識するのは、[100\n]となります。
どんなデータにもいえますが、直接データを入力すると、末尾に\nが入ります。
意外にこれを知らないと、プログラミングに多大な影響が出るケースもあります。
\nを消す有効な関数はxpectorさんが書いているので、数字の改行を取り除く方法を書いておきます。
$x+=0;
これを入力処理の後に入れてください。数字の場合、計算すれば\nは消えます。数字に影響がないように、0を足しています。
    • good
    • 0
この回答へのお礼

大変勉強になりました。
ご回答ありがとうございます。

お礼日時:2007/07/27 16:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!