【发布时间】:2014-11-11 21:05:10
【问题描述】:
我正在从字符串生成 64 位哈希码,并将此值存储在数据库中
是否可以用 64 位长类型而不是 32 字节 int 覆盖 GetHashCode?p>
如果这不可能,是否可以在其他地方实现 Equals 和 GetHashCode,并且仍然使用 except 和 Intersect?
public class RecordComparer : IEqualityComparer<Record>
{
public bool Equals(Record x, Record y)
{
if (ReferenceEquals(x, y)) return true;
if (x == null || y == null) return false;
return x.RecordHash.Equals(y.RecordHash);
}
public long GetHashCode(Record obj)
{
return obj.RecordHash;
}
}
【问题讨论】:
-
由于散列冲突,使用散列来表示相等是值得怀疑的。
-
适用于 32 位哈希整数...在 100,000 条记录后开始发生冲突。然而,64 位哈希保证了非常低的冲突率。
-
“64 位哈希保证了非常低的冲突率”:是的,它们确实如此。但不是平等。这是
IEqualityComparer<T>或Equals()的正确实现所需要的。 -
请解释一下
Intersect和Except你在这里说的是什么,以及它们与你的问题有什么关系。这些操作在 .NET 中的唯一实现无论您的哈希码是 32 位还是 64 位都同样有效,因为它们不使用哈希码来确定实际相等性。 -
有道理。但是,就我的目的而言,64 int 足够独特,我可以忍受每隔几万亿条记录发生一次碰撞。是否可以覆盖 GetHashCode 以返回 64 位整数?
标签: c# hashcode gethashcode iequalitycomparer