64位HashCodes、IEqualityComparer&;相交/除外
本文关键字:相交 除外 amp HashCodes IEqualityComparer 64位 | 更新日期: 2023-09-27 18:30:00
我从字符串中生成64位散列码,并将该值存储在数据库中
是否可以用64位长的类型而不是32字节的int重写GetHashCode?
如果这不可能,是否可以在其他地方实现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;
}
}
所有内置集合、算法和接口都不支持64位哈希代码。你必须自己建造一切。您需要一个完整的并行基础设施。
这很可能不值得付出努力。相反,使用32位哈希代码,并依靠相等性比较来确保不会发生错误匹配。这是正确性所必需的。
也许这个问题是基于误解:
基本上,我会有2个列表的64位散列码整数。我需要能够在这两个列表中使用Except/Insect来查找差异,基于64位hascode值。就目前情况来看,IEqualityComparer仅适用于32位整数。
只需将此哈希代码视为内置集合和算法中的密钥即可。使用Except
可以很好地处理这些列表。
假设您不关心具有相同哈希码的不同记录可能产生的问题,因此即使它们不同,也被认为是相等的,您可以简单地实现RecordComparer
,如下所示:
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 int GetHashCode(Record obj)
{
return unchecked((int) obj.RecordHash);
}
}
CCD_ 3通过返回通过截断标识记录的64位散列码而创建的32位散列码来正确地实现。
对于不相等的记录,GetHashCode
不需要返回唯一的散列码。然而,避免冲突将使像Dictionary<Record>
这样的通用集合性能更好,而将32位哈希码建立在64位哈希码的基础上可能是最好的做法
如果查看Enumerable.Except
和Enumerable.Intersect
的源代码,您可以看到它们使用内部类Set<T>
,这是某种哈希表,因此GetHashCode
的实现可能会影响代码的性能,但不会影响正确性(只要相等的记录返回相同的哈希代码)。