我遇到了一个碰撞,它用一个相当小的数据集(约10万行)来构建一个哈希表。我在这里做错什么了吗?
这是一个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);
可使用dotnetcore 2.1复制
答案 0 :(得分:4)
您不可能永远完全避免与哈希码发生冲突(除非类型具有小于2 ^ 32的可能不同值,例如短裤或字节之类的东西)。编写良好的哈希只是意味着尽可能地减少冲突。您可以通过尽最大努力确保哈希码(大约)均匀地分布在int
的整个范围内来做到这一点。
您还可以尝试避免某些通常共同使用的值发生冲突(例如,您可以针对日期创建一种生成算法,以使同一周中的日期不会发生冲突,并确保所有冲突发生在相距较远的日期中比那)。
但是,每当您使用生成的哈希码时,都需要某种机制来处理冲突。