如何使用 HashCode.Combine 避免冲突?

Tim*_*ace 0 c# hash .net-core

我在使用相当小的数据集(~100k 行)构建哈希表时遇到了冲突。我在这里做错了吗?

这是一个通常会生成相同哈希值的 2 位数据示例。(偶尔运行会产生不同的哈希值):

long long1 = 330765;
long long2 = 227691;
DateTime date1= new DateTime(2016, 5, 24);
DateTime date2= new DateTime(2016, 1, 25);

var c1 = HashCode.Combine(long1, date1);
var c2 = HashCode.Combine(long2, date2);
Console.WriteLine(c1);
Console.WriteLine(c2);
Run Code Online (Sandbox Code Playgroud)

可使用 dotnetcore 2.1 重现

Ser*_*rvy 5

永远无法完全避免与哈希码发生冲突(除了具有少于 2^32 个可能的不同值的类型,如 shorts 或 bytes 或类似的东西)。编写一个好的散列只是意味着尽可能地减少冲突。您可以通过尽最大努力确保您的哈希码(大约)均匀分布在int.

您还可以尝试避免通常一起使用的某些值发生冲突(例如,您可以为日期提出一种生成算法,使同一周的日期不会发生冲突,并确保所有冲突的日期相距更远) .

但是任何时候您使用生成的哈希码时,您都需要有一些处理冲突的机制。