Perl と Java で同じ結果が得られます。
$ perl x.pl | od -t x1
0000000 f7 d4 ae 4d bd df 5a d3 61 65 bb f8 be 60 45 03
0000020 e4 82 9d b6
0000024
$ javac x.java && java x | od -t x1
0000000 f7 d4 ae 4d bd df 5a d3 61 65 bb f8 be 60 45 03
0000020 e4 82 9d b6
0000024
x.pl
:
use Digest::SHA1;
my $bytes ="zWh9YZX3";
my $sha1 = Digest::SHA1->new;
$sha1->add($bytes);
print $sha1->digest;
x.java
:
import java.security.MessageDigest;
class x {
public static void main(String[] args) throws Exception {
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
String mystring ="zWh9YZX3";
byte[] bytes = mystring.getBytes();
byte[] hash = sha1.digest(bytes);
System.out.write(hash, 0, hash.length);
}
}
同じものをハッシュしていないことに注意してください。Perl コードでは、バイトをハッシュしていますzWh9YZX3
。Java コードでは、文字の環境固有のエンコーディングをハッシュしていますzWh9YZX3
。たまたま 127 より大きいバイトがあった場合、結果は異なります。
上記の Java に相当する Perl は次のようになります。
use Digest::SHA1;
use Encode;
my $mystring ="zWh9YZX3";
my $bytes = encode('???', $mystring);
my $sha1 = Digest::SHA1->new;
$sha1->add($bytes);
print $sha1->digest;
use utf8;
ソース コードが UTF-8 を使用してエンコードされている場合は、忘れずに使用してください。(それ以外の場合は、実質的に iso-8859-1 であると予想されます。)
16 進形式のダイジェストの操作について:
use strict;
use warnings;
use Digest::SHA1 qw( sha1_hex );
my $bytes = "zWh9YZX3";
my $digest_hex = sha1_hex($bytes);
print("INSERT INTO Foo VALUES (UNHEX('$digest_hex'))\n");