【发布时间】:2019-05-16 00:24:51
【问题描述】:
我在构建具有相当小的数据集(约 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);
可通过 dotnetcore 2.1 重现
【问题讨论】:
-
你用什么来组合?你必须小心“DataTable”和“Data”+“Table”都给出相同的哈希值。为了防止重复,您通常会在组合时使用“Data”+“^”+“Table”,这样您就会得到两个不同的哈希值。
-
100k 个项目的冲突是可预期的行为。
-
这是标准的生日问题。在 32 位空间中与 100k 个项目发生冲突的概率为 68%。
-
@MikeZboray 具有完美的散列和随机数据。所以这是最好的情况。如果数据不是随机的,或者散列不完善,它可以从那里上升。
-
@Servy 是的,我打算添加它。组合并不完美,输入数据可能没有覆盖完整的键空间,当然简单的哈希表没有那么多桶。