【问题标题】:What would I do with a .NET object hashcode?我将如何处理 .NET 对象哈希码?
【发布时间】:2012-10-31 14:35:15
【问题描述】:

C# 中的对象有四种方法 - {EqualsGetTypeToStringGetHashCode}。
有人可以用哈希码做什么有用的事情?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    人们可以用哈希码做什么有用的事情?

    快速找到可能相等的对象。

    特别是,这种方法通常被Dictionary<TKey, TValue>(用于键)和HashSet<T>等类型使用。

    您应该假设具有相同哈希码的对象是相等的,但是。请参阅Eric Lippert's blog post 了解更多信息,并参阅Wikipedia hash table 页面了解有关哈希码使用的更一般性讨论。

    【讨论】:

    • 键? equals方法是否认为键不同? ( IEquatable) ?
    • @RoyiNamir:是的,但它们是首先通过哈希码比较的——因为这样你可以廉价地获得潜在匹配。否则,每次从字典中提取都需要检查每个键是否相等。
    • @RoyiNamir:我从来没有提到过编译器。但至于为什么值得可能匹配 - 如果你有一本包含一百万个键的字典,你宁愿检查两个具有相同哈希码的潜在匹配,还是所有百万个键?
    • @JonSkeet 所以不同的哈希码不会有机会被检查是否相等? (因为他们不是潜在的比赛)?感谢您的回复。
    • @RoyiNamir:是的 - 如果两个对象具有不同的哈希码,它们必须不相等(以遵守合同),因此没有必要比较它们是否相等。阅读维基百科页面。
    【解决方案2】:

    哈希码是用于识别对象的数值 在平等测试期间。它也可以作为对象的索引 在一个集合中。

    GetHashCode 方法适用于散列算法和 哈希表等数据结构。

    GetHashCode 方法的默认实现没有 保证不同对象的唯一返回值。此外, .NET Framework 不保证默认实现 GetHashCode 方法,它返回的值在 .NET Framework 的不同版本。因此,默认 此方法的实现不得用作唯一对象 用于散列目的的标识符。

    GetHashCode 方法可以被派生类型覆盖。价值 types 必须重写此方法以提供哈希函数 适合该类型并提供有用的分布 哈希表。为了唯一性,哈希码必须基于值 实例字段或属性,而不是静态字段或 属性。

    在 Hashtable 对象中用作键的对象也必须覆盖 GetHashCode 方法,因为这些对象必须生成自己的哈希 代码。如果用作键的对象不提供有用的 GetHashCode 的实现,你可以指定一个哈希码提供者 当构造 Hashtable 对象时。在 .NET 框架之前 2.0 版,哈希码提供程序基于 System.Collections.IHashCodeProvider 接口。从版本开始 2.0,哈希码提供者是基于 System.Collections.IEqualityComparer 接口。

    - Sourced from MSDN:

    【讨论】:

      【解决方案3】:

      基本思想是,如果两个对象具有不同的哈希码,它们就是不同的。如果它们具有相同的哈希码,则它们可能不同或相等。

      要检查集合中是否存在对象,您可以首先检查哈希码,如果您正在比较整数,这会很快,然后只对具有相同哈希码的对象进行更准确的测试。

      这用于集合类中,例如。

      【讨论】:

        【解决方案4】:

        GetHashCode

        GetHashCode 的存在只是为了这两种类型的利益

        ->哈希表

        ->通用字典

        GetHashCode 为您提供多种密钥,以实现良好的 hashtable 性能。

        等于

        当编译时类型未知时,Equals 提供null-safe 相等比较。 它的签名是

        public static bool Equals(object A,object B).

        因此,如果在编译时类型未知,则不能使用 ==!= 之类的运算符。您必须使用 Equals

        在编写泛型类型时很有用

        例如:

        class Test<T>
        {
            T value;
            public void SetV(T newValue)
           {
           if(object.Equals(newValue,value))
           //We have to use Object.Equals cant use == or !=since they cannot bind to unknown type at compile time
           }
        }
        

        ToString

        它返回类型实例的默认texual representation。此方法被所有内置类型覆盖

        获取类型

        GetType 是在运行时评估的。它可以帮助我们了解类型的 name,assemby,base type..等

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-22
          • 1970-01-01
          • 1970-01-01
          • 2011-09-23
          相关资源
          最近更新 更多