【发布时间】:2018-11-05 22:31:28
【问题描述】:
根据我的理解,散列是一个生成唯一固定长度(假设为 64 位)输出到任意长度输入的过程。 (如有错误请指正)
因此,如果我采用散列函数可以产生的所有 (x) 个可能的 64 位散列值并在其末尾附加 0 或 1。我得到一个大小为 2x 的列表(其中每个哈希为 65 位长)。
如果我将所有 2x 组合作为相同哈希函数的输入,它如何为所有输入生成唯一哈希?
【问题讨论】:
标签: hash cryptography
根据我的理解,散列是一个生成唯一固定长度(假设为 64 位)输出到任意长度输入的过程。 (如有错误请指正)
因此,如果我采用散列函数可以产生的所有 (x) 个可能的 64 位散列值并在其末尾附加 0 或 1。我得到一个大小为 2x 的列表(其中每个哈希为 65 位长)。
如果我将所有 2x 组合作为相同哈希函数的输入,它如何为所有输入生成唯一哈希?
【问题讨论】:
标签: hash cryptography
你是对的。这被称为哈希冲突,它是真实的。这不是一个更大的交易的原因是哈希的数量非常大,以至于这些类型的冲突很少见。不过,您的 64 位示例有点不切实际。 256 位或 512 位是更可能的情况。 (即使是 128 也不再被认为足够强。)在这种情况下,哈希的范围是如此之大,以至于很难找到产生哈希冲突的输入。
【讨论】:
通过Pigeonhole principle,哈希冲突是不可避免的。即 m1 != m2 和 H(m1) = H(m2)
您不能为输入生成唯一的哈希值。发生碰撞的概率非常小。甚至,在 2^64 个可能的值内,具有 64 位输出的哈希函数也可能发生冲突。
最好使用像 SHA3 这样的哈希函数,如果您真的希望它们是唯一的,请与您之前生成的哈希值进行比较。
【讨论】: