.NET:64位哈希代码

时间:2011-11-09 00:03:08

标签: .net hash checksum crc gethashcode

我需要一个64位的字符串哈希值,默认的.GetHashCode()只返回一个32位的int。我可以生成MD5 / SHA1哈希,并且只使用前64位。但由于这些算法在加密方面是安全的,因此它们对CPU要求更高。

是否只是在输入字符串的反向处第二次调用.GetHashCode()这么简单?并将两个32位int转换为64位长?它会像CRC64这样的“真正的”64位散列具有相同的扩散和抗冲击性吗?

3 个答案:

答案 0 :(得分:3)

你将犯一个很大的错误。 64位哈希不足以保证唯一性。这需要至少128位。 guid是一种常见的选择。

生成唯一 32位或64位数字并不难,您只需使用下一个。问题是你需要知道前一个。 Dbase引擎从来没有遇到过这样的问题,他们的存在就是记住内容。

使用自动增量列。

答案 1 :(得分:2)

只是为了解决这个问题,你知道GetHashCode()没有产生任何独特的东西,对吧?两个完全不同的字符串可以返回相同的哈希码。该算法仅用于在哈希表中创建对象的均匀分布。

From the horse's mouth

  

GetHashCode方法的默认实现没有   保证不同对象的唯一返回值。

此外,当您致电GetHashCode() 时所发生的事情的规则可以并且 随时间而变化。请参阅标题为“规则:GetHashCode的消费者不能依赖它在一段时间内或在appdomains上保持稳定”here,特别是:

  

这在过去曾经被人咬伤过。的文档   System.String.GetHashCode具体指出两个完全相同   字符串可以在不同的版本中具有不同的哈希码   CLR,事实上他们确实如此。不要在数据库中存储字符串哈希值   期望它们永远是一样的,因为它们不会是。

To see someone's collision detection work check this out.

答案 2 :(得分:0)

您选择64位是否有特殊原因? MD5更多的用于检查内容是否在意外情况下没有发生变化,而SHA更多的是确保内容不是故意更改的。我绝对会使用LEAST SHA1。