如何“减少”哈希?

时间:2010-06-13 15:56:05

标签: .net hashcode

假设我有任何“长”哈希,如16字节MD5或20字节SHA1。 我想减少这个哈希以适应4个字节,用于GetHashCode()目的。

首先,我完全清楚我会遇到更多的碰撞。在我的情况下,这完全没问题,但我仍然希望减少碰撞的可能性。

我的问题有几种解决方案:

  • 我可以获取哈希的4个第一个字节。
  • 我可以获取哈希的最后4个字节。
  • 我可以接受4个随机字节的哈希值。
  • 我可以生成哈希的哈希值,包括经典的素数乘法。

还有其他我没想过的解决方案吗?更重要的是,什么方法会给我最独特的哈希码?我现在假设它们几乎相同。

Microsoft选择组件的公钥令牌是其公钥的SHA1哈希的最后8个字节,因此我可能会选择此解决方案,但我想知道原因。

5 个答案:

答案 0 :(得分:8)

任何哈希都已经减少了。

加密哈希的设计使得数据的任何部分对哈希的任何部分的影响都不会超过任何其他部分。因此,您选择的哈希位数无关紧要。

答案 1 :(得分:5)

除了第三个选项之外的任何选项 - 随机选择字节 - 工作正常。如果你通过随机选择字节,相同的输入每次都会产生不同的哈希码,这会破坏哈希码的目的。

答案 2 :(得分:1)

如果你随机取4个字节,那么你会遇到两个完全相同的SHA1哈希产生不同的GetHashCode哈希的情况。

我只选择前4个字节 - SHA1的设计使得任何字节都不应该像其他任何字节一样重要。

答案 3 :(得分:0)

如果您有合理数量的哈希值,请将它们编入索引(例如存储在数据库中):

1 - 987baf9gfd79b7979debe90085eadf5
2 - 9754gccgfd79s7979abbc90085eadf5
...

答案 4 :(得分:0)

如果您当前的哈希值保存为字符串,只需在该字符串上调用GetHashCode,它将返回一个4字节的int。

有用吗?