计算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; } }