GetHashCode() 的研究

有个实体类。比如

1 public   class   Customer
2 {
3         public   int   ID { get ; set ; }
4        
5         public   string   Name { get ; set ; }
6 }

 

在创建多个这样的实体类过程中。我需要判断2个Customer实例的ID属性是否是同一个。

 

我们可以这样做

  if (CustomerA.ID == CustomerB.ID)

或许我们还有其它方法

        public   override   int   GetHashCode ( )
        {
            return   this . ID . GetHashCode ( ) ;
        }

        public   override   bool   Equals ( object   obj )
        {
            if   ( obj   = =   null )
            {
10                 return   false ;
11             }
12
13             if   ( obj . GetType ( )   = =   this . GetType ( ) )
14             {
15                 return   obj . GetHashCode ( )   = =   this . GetHashCode ( ) ;
16             }
17
18             return   false ;
19         }
20

那么我们就可以这样判断了

if (CustomerA.Equals(CustomerB))

 

以下是我对GetHashCode()做的一个简单测试

public static void RunSnippet()
{
    int aaa= 111;
    Console.WriteLine(aaa.GetHashCode());
    int bbb= 111;   
    Console.WriteLine(bbb.GetHashCode());
    string xxx="111";
    Console.WriteLine(xxx.GetHashCode());
    string yyy ="111";
    Console.WriteLine(yyy.GetHashCode());
    string zzz ="zzz";
    Console.WriteLine(zzz.GetHashCode());
}

 

image

 

getHashCode() 取值范围是 int.MinValue ~ int.MaxValue

它的算法将数字左移动16位,再与原来的数字进行异或操作,最后将结果乘以16进制数15051505

public override int GetHashCode()

{

  return (number ^ number << 16)* 0x15051505;

}

 

实际应用中我们还可以用来测试2个对象是否引用一个堆区 

转载于:https://www.cnblogs.com/yuanhuaming/archive/2009/12/11/1621780.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值