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

本文关键字:哈希 代码 唯一性 检查 字符串 数组 用于 | 更新日期: 2023-09-27 18:21:31

我将大量的数据数组存储到List中,但是,如果数据已经存在于我的列表中,我不想存储它——数据的顺序无关紧要。我认为使用GetHashCode生成哈希代码是合适的,因为应该不关心顺序。然而,我在下面的一个简单测试中发现,对于前两个字符串[]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());

上面测试的结果产生了三个不同的hashcode结果。

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

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

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

如果希望单独创建的具有相等元素的集合比较为相等,请使用支持此功能的集合类型。

我推荐HashSet<T>,在您的情况下推荐HashSet<string>。它没有直接提供您想要的GetHashCode()Equals()行为,但它有一个CreateSetComparer()方法,它为您提供了一个助手类,可以为您提供哈希代码和比较器方法,以满足您的需要。

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

如果你说a1.GetHashCode(),这将始终为你生成一个新的哈希代码:

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());
    }
}