我需要一个64位的字符串哈希值,默认的.GetHashCode()只返回一个32位的int。我可以生成MD5 / SHA1哈希,并且只使用前64位。但由于这些算法在加密方面是安全的,因此它们对CPU要求更高。
是否只是在输入字符串的反向处第二次调用.GetHashCode()这么简单?并将两个32位int转换为64位长?它会像CRC64这样的“真正的”64位散列具有相同的扩散和抗冲击性吗?
答案 0 :(得分:3)
你将犯一个很大的错误。 64位哈希不足以保证唯一性。这需要至少128位。 guid是一种常见的选择。
生成唯一 32位或64位数字并不难,您只需使用下一个。问题是你需要知道前一个。 Dbase引擎从来没有遇到过这样的问题,他们的存在就是记住内容。
使用自动增量列。
答案 1 :(得分:2)
只是为了解决这个问题,你知道GetHashCode()
没有产生任何独特的东西,对吧?两个完全不同的字符串可以返回相同的哈希码。该算法仅用于在哈希表中创建对象的均匀分布。
GetHashCode方法的默认实现没有 保证不同对象的唯一返回值。
此外,当您致电GetHashCode()
时所发生的事情的规则可以并且 随时间而变化。请参阅标题为“规则:GetHashCode的消费者不能依赖它在一段时间内或在appdomains上保持稳定”here,特别是:
这在过去曾经被人咬伤过。的文档 System.String.GetHashCode具体指出两个完全相同 字符串可以在不同的版本中具有不同的哈希码 CLR,事实上他们确实如此。不要在数据库中存储字符串哈希值 期望它们永远是一样的,因为它们不会是。
答案 2 :(得分:0)
您选择64位是否有特殊原因? MD5更多的用于检查内容是否在意外情况下没有发生变化,而SHA更多的是确保内容不是故意更改的。我绝对会使用LEAST SHA1。