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位HashCodes、IEqualityComparer&;相交/除外

所有内置集合、算法和接口都不支持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.ExceptEnumerable.Intersect的源代码,您可以看到它们使用内部类Set<T>,这是某种哈希表,因此GetHashCode的实现可能会影响代码的性能,但不会影响正确性(只要相等的记录返回相同的哈希代码)。