背景: Python スクリプトと Java Web アプリケーションから計算する必要がある反復ハッシュ アルゴリズムがあります。
疑似コード:
hash = sha256(raw)
for x=1 to 64000 hash = sha256(hash)
ここで、hash は長さ 32 のバイト配列であり、長さ 64 の 16 進文字列ではありません。
バイト単位で保持したい理由は、Python は各反復の間に 16 進文字列に変換して処理時間を 1 秒未満に抑えることができますが、Java では文字列のオーバーヘッドに 3 秒かかるためです。
したがって、Java コードは次のようになります。
// hash one time...
byte[] result = sha256(raw.getBytes("UTF-8"));
// then hash 64k-1 more times
for (int x = 0; x < 64000-1; x++) {
result = sha256(result);
}
// hex encode and print result
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb);
for (int i=0; i<buf.length; i++) {
formatter.format("%02x", buf[i]);
}
System.out.println(sb.toString());
Python コードは次のようになります。
import hashlib
# hash 1 time...
hasher = hashlib.sha256()
hasher.update(raw)
digest = hasher.digest()
# then hash 64k-1 times
for x in range (0, 64000-1):
# expect digest is bytes and not hex string
hasher.update(digest)
digest = hasher.digest()
print digest.encode("hex")
Python の結果は、生のダイジェスト バイトではなく、最初のダイジェスト (文字列) の 16 進表現でハッシュを計算しました。そのため、さまざまな出力が得られます。