3

背景:我有一个迭代哈希算法,需要从 Python 脚本和 Java Web 应用程序计算。

伪代码:

hash = sha256(raw)
for x=1 to 64000 hash = sha256(hash)

其中 hash 是长度为 32 的字节数组,而不是长度为 64 的十六进制字符串。

我想将其保留为字节的原因是,尽管 Python 可以在每次迭代之间转换为十六进制字符串并将处理时间保持在一秒以下,但 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 结果计算了第一个摘要(字符串)的十六进制表示的哈希值,而不是原始摘要字节。所以,我得到不同的输出。

4

1 回答 1

5

hasher 的 .update 方法将参数附加到以前的文本(Python 文档)。相反,您应该在每次要计算摘要时创建新的哈希。

import hashlib

# hash 1 time...
digest = hashlib.sha256(raw).digest()

# then hash 64k-1 times
for x in range(0, 64000-1):
  digest = hashlib.sha256(digest).digest()
print digest.encode("hex")
于 2012-04-19T19:24:46.640 回答