【发布时间】:2014-05-01 04:23:23
【问题描述】:
我有一个Map<SHA1, BinaryBlob>。与 Git 非常相似。
我想在这张地图中放入少量有限数量的“特殊”条目。我希望能够更改二进制 blob 的值,但仍通过相同的键引用它们。
正确的做法是使用Map<Either<SHA1, SpecialKey>, BinaryBlob>。
执行此操作的 hack 方式(这是我实际执行此操作的方式)是定义:
SHA1 specialKeyA = 0x00000 ... 00
SHA1 specialKeyB = 0x00000 ... 01
我了解 SHA1 产生的值是均匀分布的。但我想知道是否可能有一个星号,以及是否有几个极端情况哈希(例如0x00.. 或0xFF...)保证不会发生。
我对我目前的设计感觉很安全,但我只是好奇:)
编辑:我已经指望哈希唯一性了,所以我觉得这个设计非常安全。出于好奇,问题是:是否有一些 SHA1 碰巧无法生成的值。到目前为止,cmets 中的人口普查似乎没有......
【问题讨论】:
-
可以肯定,任何此类偏见都会是一个缺陷,会使逆转变得更加容易/可能。
-
鉴于您的“魔术哈希值”在天文上不太可能与任何东西发生冲突,我会说“去吧”。它仍然是一个黑客。但在这一点上,我们不要过度设计。
-
您的问题的答案是也许。 SHA1 产生 20 字节的输出;由于鸽巢原理,这些输出中的每一个都将在 0 到 264 - 1 的输入范围内产生。如果您可以将“hack”存储为任何其他 然后是 20 字节,然后这样做;那么你就完成了。
-
@ElliottFrisch 也许应该补充一点,所有 SHA1 哈希的可能性都相同(不)。因此,在给定的上下文中,虽然问题的答案可能是“否”,但建议的方法仍然相当安全。
-
@Sigi 我修改了我的评论。如果您存储的魔法散列值不是 20 字节长度,则它不能是有效的 SHA1 散列。因此,对于 SHA1,21 字节的散列尤其是不太可能。