java - 如何使用 native 库(即 hashlib)在 Python 中迭代 sha256,使用字节 [] 作为输入而不是十六进制字符串

标签 java python hash hex sha256

背景:我有一个迭代哈希算法,需要从 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/

相关文章:

algorithm - 哈希什么时候发生冲突?

java - 正确的 AspectJ 切入点表达式

java - 使用导入的 XSD 和绑定(bind)生成 JAXB 类

python - 键盘中断程序不返回值

perl - 如何与具有哈希属性的 Perl 对象交互?

perl - 如何用 perl 写得更好

java - Primefaces 处理程序到 penult 选项卡

带参数的 Java Web 服务 MYSQL

python - 如何重新排列包含关系运算符的 sympy 表达式

python - 如何在不复制的情况下从 Windows 命令行合并两个目录或用替换移动?