zoukankan      html  css  js  c++  java
  • 计算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;
            }
        }
  • 相关阅读:
    ASP.NET MVC 学习之路-2
    ASP.NET MVC 学习之路-1
    mvp框架
    Linq基础
    C# Lambda表达式
    三层架构基础
    Protobuf-net基础
    AutoResetEvent和ManualResetEvent
    解题报告——POJ 2299
    解题报告——POJ 2726
  • 原文地址:https://www.cnblogs.com/zhshlimi/p/8471752.html
Copyright © 2011-2022 走看看