计算具有字符串属性的类的哈希码的最佳方法是什么?

War*_*ock 6 c# gethashcode

我有一个带有字符串属性的类,我需要重写GetHashCode()方法。

class A
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
    public string Prop3 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

第一个想法是做这样的事情:

public override int GetHashCode()
{
    return Prop1.GetHashCode() ^ Prop2.GetHashCode() ^ Prop3.GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)

第二个想法是:

public override int GetHashCode()
{
    return String.Join(";", new[] {Prop1, Prop2, Prop3}).GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)

什么是最好的方法?

Ced*_*amo 3

只需将每个字符串的哈希值异或在一起即可。它比字符串连接更便宜(性能方面),而且据我所知,它并不更容易发生冲突。假设每个字符串有 5 个字符长,每个字符占用 1 个字节。在第一个中,您将 15 个字节散列到 4 个字节 (int)。在第二个中,您将连接所有 3 个字符串(这是一项昂贵的操作),最终得到一个 15 字节的字符串,并将其哈希为 4 字节。两者都将 15 字节转换为 4 字节,因此理论上两者在冲突方面非常相似。

实际上,碰撞概率存在一些差异,但实际上这可能并不总是重要。这取决于字符串将具有的数据。如果所有 3 个字符串都相等并且它们各自散列到0001(我只是为了示例而使用一个简单的数字)。如果所有 3 个都相等,那么对前两个进行异或即可得到0000,对第三个进行异或则可以得到0001。通过连接字符串,可以以牺牲一些性能为代价来避免这种情况(如果您正在编写性能关键的程序,我不会在内部循环中连接字符串)。

所以最后我还是没有真正给出答案,原因很简单,确实没有答案。这完全取决于它将在何处以及如何使用。