在读.net 源码时读到这个,
在 Rectangle 类的一个方法!  
//不懂什么 意思!
//好象是在对距形的数据压缩
public override int GetHashCode()
{
return (((this.X ^ ((this.Y << 13) | (this.Y >> 0x13))) ^ ((this.Width << 0x1a) | (this.Width >> 6))) ^ ((this.Height << 7) | (this.Height >> 0x19)));
}
求高手解译,
 这什么 有什么 用?.net

解决方案 »

  1.   

    Object.GetHashCode 方法
    用作特定类型的哈希函数。GetHashCode 适合在哈希算法和数据结构(如哈希表)中使用。 
      

  2.   

    看不懂,那些位运算的意义,

      从感觉,
          一样大小的距形的 GetHashCode  返回相同的数据,
          可是,不相等的距形的 GetHashCode  也可能返回相同的数据。所以不知他意义何在。
      

  3.   

    计算散列值,把一个对象的内容映射到一个int型整数上,让一个对象的内容对应一个int值,对象内容不同对应的int值不同,对象内容相同对应的int值相同,这样,像Dictionary和HashSet之类的集合类型就可以用散列来快速查找,如果GetHashCode散列得均匀,Dictionary和HashSet等集合进行查找key操作的时候会很快,如果GetHashCode散列得不均匀,查找速度会变慢,如果不能理解我的这些话,请详细看大学教科书《数据结构》中的有关散列的章节,
      

  4.   


    你的直观感觉是对的。Hash算法用来产生对应数据的摘要,这个摘要可以用来进行粗略比较、索引、查找、分组、抽样、校验等很多用途。相同(相同的概念由数据结构设计者决定)的数据一定拥有相同的hash值,不同的数据可以有相同或者不同的hash。hash算法的选取尽量满足如下目标:(1)均匀的分布。随机的数据,产生的hash不应该集中在很小的数值范围内;(2)雪崩效应,改变数据,得到的hash应该有很大的不同;(3)很小的碰撞概率,也就是随机2个不同数据的hash相等的概率要低;(4)很高的效率,hash算法本身要高效。为什么要这4个目标,从我前面说的用途不难理解。
      

  5.   

    我怎么感觉这个方法是它自己命名的,不是之前的GetHashCode()
      

  6.   

    上面的大侠的意思是说?
    ----如下使用

    1·如下声明一个数据类型 的变量
         Dictionary<int,list<object>> saveData  用GetHashCode方向取得的数据 做dictionary 的key 键,
     
       当有很多 Rectangle 类型 的数据要存储的时候,就往saveData 变量里面 push就上面的方法,他的效率我还是有一点疑问,
      他与下面一种方法比较起来哪一个快?

    2·直接用List<Rectangle> 变量来存放。
         
      

  7.   

    还是这个意思,
      来的数据本身就是这种Dictionary<Rectangle ,object> saveData
    用Rectangle  key 就不如用int 做key 的效率高
    所以要把Rectangle  对象(有损地压缩成int 类型)
       那么,这样就成了一对多的关系了!这时就可以用下面的类型来代替上面的类型、//注意,saveData的key 由 Rectangle对象的GetHashCode()方法取得
    Dictionary<int,object[]> saveData 
    大侠是这个意思么?
      

  8.   

    意思是这么个意思
    但是Dictionary在内部处理Hash碰撞。
      

  9.   

    GetHashCode 和 IsEqual 共同来判断两个对象是否相等。HashCode即对象在内存中的地址
      

  10.   


    上面的应该不是这样的吧!  实际应用,是先进行 对象的 GetHashCode 
    判断,GetHashCode 方法很快, 而且返回是int 类型 ,只有32位。
    比较很快。
       做HashCode 第一次过滤!当 HashCode  过滤没效时,才有必要进行[全判断]即Ojbect 的IsEqual  方法所以用法应该是://比较objectA =? objectB  bool isEqual = false;
      if(objectA.HashCode()==objectB.HashCode())////这个比较耗时快
      {
          isEqual  = (objectA.HashCode()==objectB.HashCode());//这个比较耗时
      }// 
    而Object.ReferenceEquals() 才是比较内存地址!
      

  11.   

    改成
    //比较objectA =? objectB
     
      bool isEqual = false;
      if(objectA.HashCode()==objectB.HashCode())////这个比较耗时快
      {
          isEqual  = object.Equals(objectA,objectB);//这个比较耗时
      }