用于检查字符串数组中唯一性的哈希代码
本文关键字:哈希 代码 唯一性 检查 字符串 数组 用于 | 更新日期: 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());
}
}