确定性伪随机数生成器如何使用 SHA-256 哈希函数从 32 字节种子生成 64 字节哈希?

How can Deterministic Pseudo Random Number Generator generate 64 byte hash from 32 byte seed using SHA-256 hashing function?

SHA-256 哈希函数始终输出 32 字节哈希值。我如何使用 32 字节种子和 SHA-256 哈希函数创建 64 字节哈希输出?

我听说他们使用这样的技术(伪代码):

init_hash = SHA256 (seed)
next_hash = SHA256 (init_hash + 1)
next_hash_vol2 = SHA256 (next_hash + 2)
next_hash_vol3 = SHA256 (next_hash_vol2 + 3)
...
next_hash_volA = SHA256 (next_hash_vol9 + A)
...
next_hash_vol10 = SHA256 (next_hash_volF + 10)
...
...
next_hash_vol64 = SHA256 (next_hash_vol63 + 40)

这听起来真不错!但问题是 SHA-256 总是生成 32 字节输出,但我需要 64 字节 :(

如果您从 32 字节的种子和 32 字节的散列开始,无论您将其扩展多少,最终都会得到 32 字节的熵。

鉴于此,您有很多选择,例如@David Schwartz 建议的那个。这是伪代码中的一个不同选项:

hash64(inputString)
  hash1 = SHA256(inputString)
  hash2 = SHA256(hash1)
  return concatenate(hash1, hash2)
end hash64

许多其他类似的选项也是可能的,例如:

hash64(inputString)
  gnirtStupni = reverse(inputString)
  hash1 = SHA256(inputString)
  hash2 = SHA256(gnirtStupni)
  return concatenate(hash1, hash2)
end hash64

本质上,两个独立的散列基于相同的输入,但经过调整因此散列不相同。然后连接两个哈希值。