【问题标题】:Hashcode to check uniqueness in a string array哈希码检查字符串数组中的唯一性
【发布时间】:2015-11-11 23:07:00
【问题描述】:

我将大量数据数组存储到一个列表中,但是,如果数据已经存在于我的列表中,我不想存储它——数据的顺序无关紧要。我认为使用 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 的 Hashcode 相同...所以我正在寻找可以让我快速检查这些字符串是否已经存在的东西。

【问题讨论】:

  • 使用字典 或 HashMap
  • 你不能在这里使用GetHashCode,因为 1. GetHashCode 在数组上确实关心元素的顺序。 2.GetHashCode只查看数组的最后8个元素。
  • Mitch - 进行了搜索,显然没有解决方案。 Sten - 您能否详细说明字典/哈希图的含义...不确定键/值对将如何解决我的困境
  • 我很确定数组对GetHashCode() 的实现实际上并没有以任何方式检查内容。因此,对不同但内容等效的数组的引用将产生不同的 HashCode。
  • @MarcinJuraszek 你的意思是int IStructuralEquatable.GetHashCode(IEqualityComparer comparer) 方法吗?它是一个显式接口方法实现(它也有一个参数),它不会在Array 变量上调用。 Array 不会覆盖 object.GetHashCode()。它使用object 实现,第一次在实例上调用它时返回一个伪随机数。

标签: c# .net linq hashcode gethashcode


【解决方案1】:

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

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

我推荐HashSet<T>,在你的情况下是HashSet<string>。它不直接提供您想要的 GetHashCode()Equals() 行为,但它有一个 CreateSetComparer() 方法,为您提供一个帮助器类,确实为您提供哈希码和比较器方法做你想做的事。

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

【讨论】:

  • 它甚至不需要是随机的。只要求相等的对象产生相同的哈希码,特定类型的所有对象返回相同的哈希码在技术上满足这一点。
  • @TheInnerLight 是的,这是另一种选择,尽管这是一个糟糕的实现(除非该类型的所有对象实际上都应该比较相等,在这种情况下你的评论不适用)我' d 建议避免使用任何具有该属性的类,因为它也可能有更严重的错误。 :)
  • 哦,是的,这太可怕了,我绝对不建议一秒钟的行为。我的评论绝对不是对以这种方式写作课程的认可。这只是为了概述绝对最坏的情况。
  • @hvd 与 CreateSetComparer() 类,我只需要重载并编写自己的标准还是自动执行比较?在这里寻找一个快速简单的解决方案
  • @Reza CreateSetComparer() 是一个方法,而不是一个类。它确实使用了一个类,但您不能直接访问该类。您不仅不必重载或覆盖任何东西,而且没有任何方法可以重载或覆盖任何东西。
【解决方案2】:

如果你说 a1.GetHashCode(),这将是 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());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2020-07-19
    • 2013-10-07
    相关资源
    最近更新 更多