GetHashCode注意点-转

GetHashCode注意点:

  1. GetHashCode 方法的默认实现不保证针对不同的对象返回唯一值。而且,.NET Framework 不保证 GetHashCode 方法的默认实现以及它所返回的值在不同版本的 .NET Framework 中是相同的。因此,在进行哈希运算时,该方法的默认实现不得用作唯一对象标识符。
  2. GetHashCode 方法可以由派生类型重写。值类型必须重写此方法,以提供适合该类型的哈希函数和在哈希表中提供有用的分布。为了获得最佳结果,哈希代码必须基于实例字段或属性(而非静态字段或属性)的值。
  3. 如果两个对象的比较结果相等,则每个对象的 GetHashCode 方法都必须返回同一个值。但是,如果两个对象的比较结果不相等,则这两个对象的 GetHashCode 方法不一定返回不同的值。
  4. 一个对象的 GetHashCode 方法必须总是返回同一个哈希代码,但前提是没有修改过对象状态,对象状态用来确定对象的 Equals 方法的返回值。请注意,这仅适用于应用程序的当前执行,再次运行该应用程序时可能会返回另一个哈希代码。
  5. 为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
  6. String 类提供的 GetHashCode 方法的实现为相同的字符串值返回相同的哈希代码。因此,如果两个 String 对象表示相同的字符串值,则它们返回相同的哈希代码。

例如:string str1 = "Hello world";

string str2 = "Hello world";

则str1.GetHashCode() == str2.GetHashCode().

  1. 重写 GetHashCode 的派生类还必须重写 Equals,以保证被视为相等的两个对象具有相同的哈希代码;否则,Hashtable 类型可能无法正常工作。

    例如通过Reflector查看int类型的GetHashCode的实现如下:

    public override int GetHashCode()
    

     

    {
    
    return this;

     

    }

    更常见的是当一个类型含有多个字段时,用OR运算来产生HashCode,例如Point结构体:

    public override int GetHashCode()
    

     

    {
    

     

    return (this.x ^ this.y);

     

    }
    

     

    又如下面的例子:

    using System;

    public class SomeType {

    public override int GetHashCode() {

    return 0;

    }

    }

     

    public class AnotherType {

    public override int GetHashCode() {

    return 1;

    }

    }

     

    public class LastType {

    public override int GetHashCode() {

    return 2;

    }

    }

     

    public class MyClass {

    SomeType a = new SomeType();

    AnotherType b = new AnotherType();

    LastType c = new LastType();

     

    public override int GetHashCode () {

    return a.GetHashCode() ^ b.GetHashCode() ^ c.GetHashCode();

    }

    }

0
0
(请您对文章做出评价)

posted on 2010-02-26 12:20  chuncn  阅读(281)  评论(0编辑  收藏  举报

导航