我有一个自定义对象,我们将其称为“MyObject”。它具有三个主要属性,称为 X、Y 和 Z,它们决定了它是否是唯一的。我有一个 HashSet,在 HashSet 中包含 400,000 个“MyObject”。我最初生成唯一哈希码的解决方案既简单又快速。
return Convert.ToInt32(X * 76 + Y * 100 + Z * 23);
但是,由此生成的整数不够唯一。使用当前的 HashCode,这两个点匹配,即使 Y 略有不同。
X:392598.200000000190 Y:4935367.900000000400
X: 392598.200000000190 Y: 4935367.900580000100
我试过的:
double value = (X * 101 + Y * 89 + Z * 56);
return value.GetHashCode();
- 非常准确,有 1 - 10,000 条记录,只需几秒钟即可计算出差异。然而,有 400,000 条记录,它陷入了困境。我让它运行了 17 个小时,它仍然没有返回我的结果。
- 转换为字符串,然后获取字符串的哈希码。精确,但无用的缓慢。
增加 X、Y 和 Z 的乘数。生成的数字变得太大。我尝试使用这里使用的方法:http: //msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
return ((int)value ^ (int)(value >> 32));
但是它不再允许整数。我还担心,即使我增加了大小,它可能会像我的其他解决方案一样变得无用缓慢。
如果匹配,我无法进行额外检查,因为 400,000 条记录中有 390,000 条可能匹配
什么是最好的解决方案?或者有没有办法让我的两个已经精确的操作显着更快?我正在考虑从小数点后的值中删除所有零,直到它遇到非零,然后使用我原来的逻辑,即(45.0002030 将变为 45.2030)