在.NET中使用String.GetHashCode()的哈希质量和稳定性?

Joa*_*rel 17 .net c# string hash

我想知道在.NET中实现产生的哈希质量哈希稳定性String.GetHashCode()

关于质量,我专注于算法方面(因此,哈希的质量,因为它影响大型哈希表,而不是安全问题).

然后,关于稳定性,我想知道从一个.NET版本到下一个版本可能出现的潜在版本问题.

关于这两个方面的一些亮点将非常感激.

Gre*_*ech 19

我无法向您提供有关质量的任何细节(尽管我认为这是非常好的,因为字符串是框架的核心类之一,可能被用作哈希键).

但是,关于稳定性,在不同版本的框架上生成的哈希代码不保证是相同的,并且它在过去已经改变,所以你绝对不能依赖于版本之间的哈希代码是稳定的(参见此处它在1.1和2.0之间变化的引用.实际上,它甚至在同一框架版本的32位和64位版本之间也有所不同; 来自文档:

GetHashCode返回的值取决于平台.对于特定的字符串值,它在32位和64位版本的.NET Framework上有所不同.


Eld*_*rum 13

这是一个老问题,但我想通过提及这个关于哈希质量的微软错误做出贡献.

简介:在64b上,当字符串包含'\ 0'字节时,哈希质量非常低.基本上,只会对字符串的开头进行哈希处理.

如果像我一样,你必须使用.Net字符串来表示二进制数据作为高性能字典的关键,你需要注意这个bug.

太糟糕了,这是一个WONTFIX ...作为旁注,我不明白当代码包括时,他们怎么能说修改哈希码是一个重大改变

// We want to ensure we can change our hash function daily.
// This is perfectly fine as long as you don't persist the
// value from GetHashCode to disk or count on String A
// hashing before string B. Those are bugs in your code.
hash1 ^= ThisAssembly.DailyBuildNumber;
Run Code Online (Sandbox Code Playgroud)

并且无论如何,在x86/64b中哈希码已经不同了.