用于检查字符串数组中唯一性的哈希码

Hashcode to check uniqueness in a string array

我正在将大量数据数组存储到一个列表中,但是,如果数据已经存在于我的列表中,我不想存储它 - 数据的顺序无关紧要。我认为使用 GetHashCode 生成哈希码是合适的,因为它 应该 不关心顺序。但是,我通过下面的简单测试发现,对于前两个 string[] a1 和 a2,它会生成不同的哈希码。

我可以不用这种检查方法吗?有人可以建议更好的检查方法吗?

        string[] a1 = { "cat", "bird", "dog" };
        string[] a2 = { "cat", "dog", "bird" };
        string[] a3 = { "cat", "fish", "dog" };

        Console.WriteLine(a1.GetHashCode());
        Console.WriteLine(a2.GetHashCode());
        Console.WriteLine(a3.GetHashCode());

上述测试的结果产生三个不同的哈希码结果。

理想情况下,我希望看到 a1 和 a2 具有相同的哈希码...所以我正在寻找可以让我快速检查这些字符串是否已经存在的东西。

根据数组用于确定相等性的标准,您的数组不相等。数组用于确定相等性的标准是两个单独创建的数组永远不会相等。

如果您希望单独创建的具有相等元素的集合进行比较,那么请使用支持该操作的集合类型。

我推荐 HashSet<T>,在你的情况下 HashSet<string>。它不直接提供您想要的 GetHashCode()Equals() 行为,但它有一个 CreateSetComparer() 方法为您提供 提供的帮助程序 class 为您提供散列码和比较器方法,满足您的需求。

请记住,您不能将其用于快速相等性检查。您只能将其用于快速 inequality 检查。两个不相等的对象可能仍然具有相同的哈希码,基本上是随机的。只有当哈希码不相等时,您才能跳过相等性检查。

如果你说a1.GetHashCode(), this will always generate a new hash code for you:

using System;

public class Program
{
    public static void Main()
    {
        string[] a1 = { "cat", "bird", "dog" };
        string[] a2 = { "cat", "dog", "bird" };
        string[] a3 = { "cat", "fish", "dog" };

        Console.WriteLine(a1.GetHashCode());
        Console.WriteLine(a2.GetHashCode());
        Console.WriteLine(a3.GetHashCode());
    }
}