计算hashCode通用计算公式

1.java计算公式

@Override
    public int hashCode() {
        //设置初始值
        int result = 17;

        //假设有效域为: name,age,idCardNo,incomeAnnual,sex,brithDay
        int c = 0;
        //计算name (String为对象类型,他的计算直接调用本身的hashCode)
        c = name.hashCode();
        result = result * 37 + c;

        //计算age (int/byte/char/short类型,他的计算直接调用本身的值)
        c = this.getAge();
        result = result * 37 + c;

        //计算idCardNo (long类型,他的计算 (int)(field^(field >>> 32)) 无符号右移32位)
        c = (int) (this.idCardNo ^ (this.idCardNo >>> 32));
        result = result * 37 + c;

        //计算 incomeAnnual (double类型,他的计算 Double.doubleToLongBits(field)后,再按Long类型计算 )
        //(float类型,他的计算 Float.floatToIntBits(field)  )
        long tmp = Double.doubleToLongBits(this.incomeAnnual);
        c = (int) (tmp ^ (tmp >>> 32));
        result = result * 37 + c;

        //计算 sex (sex为boolean类型,他的计算直接调用 c=sex?1:0)
        c = this.isSex() ? 1 : 0;
        result = result * 37 + c;

        //计算 brithDay (brithDay为Date对象类型,他的计算直接调用 本身的hashCode)
        c = this.getBirthDay().hashCode();
        result = result * 37 + c;

        return result;
    }

 2. .net计算公式

public class HashCodeTest
    {
        public static void Excute()
        {
            var man = new Man()
            {
                Age = 10,
                BirthDay = new DateTime(1950,1,1),
                IdCardNo = 2139095040,
                IncomeAnnual = 10000000.5,
                Name = "Aven",
                Sex = true
            };
            var hasCode = man.GetHashCode();
            Console.WriteLine(hasCode);
        }
    }

    class Man
    {
        public long IdCardNo { get; set; }
        public int Age { get; set; }
        public string Name { get; set; }
        public double IncomeAnnual { get; set; }
        public bool Sex { get; set; }
        public DateTime BirthDay { get; set; }

        public override int GetHashCode()
        {
            //设置初始值
            int result = 17;

            //假设有效域为: name,age,idCardNo,incomeAnnual,sex,brithDay
            int c = 0;
            //计算name (String为对象类型,他的计算直接调用本身的hashCode)
            c = Name.GetHashCode();
            result = result * 37 + c;

            //计算age (int/byte/char/short类型,他的计算直接调用本身的值)
            c = this.Age;
            result = result * 37 + c;

            //计算idCardNo (long类型,他的计算 (int)(field^(field >> 32)) 有符号右移32位,符号位不移动)
            c = (int)(this.IdCardNo ^ (this.IdCardNo >> 32));
            result = result * 37 + c;

            //计算 incomeAnnual (double类型,他的计算 BitConverter.DoubleToInt64Bits(field)后,再按Long类型计算 )
            //(float类型,他的计算 BitConverter.ToInt32(BitConverter.GetBytes(this.IncomeAnnual),0) )
            long tmp = BitConverter.DoubleToInt64Bits(this.IncomeAnnual);
            c = (int)(tmp ^ (tmp >> 32));
            result = result * 37 + c;

            //计算 sex (sex为boolean类型,他的计算直接调用 c=sex?1:0)
            c = this.Sex ? 1 : 0;
            result = result * 37 + c;

            //计算 brithDay (brithDay为Date对象类型,他的计算直接调用 本身的hashCode)
            c = this.BirthDay.GetHashCode();
            result = result * 37 + c;

            return result;
        }
    }

 

posted @ 2018-02-26 10:13  zslm___  阅读(6999)  评论(1编辑  收藏  举报