背景:我有一个迭代哈希算法,需要从 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 结果计算了第一个摘要(字符串)的十六进制表示的哈希值,而不是原始摘要字节。因此,我得到了不同的输出。
最佳答案
hasher 的 .update 方法将参数附加到先前的文本 (Python docs)。相反,您应该在每次要计算摘要时创建新的哈希器。
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")
关于java - 如何使用 native 库(即 hashlib)在 Python 中迭代 sha256,使用字节 [] 作为输入而不是十六进制字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10235161/