基于对象的某些属性创建唯一的哈希代码

时间:2016-01-05 08:10:09

标签: c# hash compare

我必须关注课程:

public class NominalValue
{
   public int Id {get; set;}
   public string ElementName {get; set;}
   public decimal From {get; set;}  
   public decimal To {get; set;}    
   public bool Enable {get; set;}   
   public DateTime CreationDate {get; set;}
   public int StandardValueId {get; set;}  //FK for StandardValue
} 
public class StandardValue
{
   public int Id {get; set;}
   public string ElementName {get; set;}
   public decimal From {get; set;}  
   public decimal To {get; set;}    
   public bool Enable {get; set;}   
   public DateTime CreationDate {get; set;}
} 

用户想要填充nominalValue对象属性。填充nominalValue属性可以双向执行:

  1. 手动填写nominalValue的值。
  2. 来自nominalValue对象的standardValue的用户加载值,然后更改某些值。
  3. 有时我需要知道指定元素的nominalValue个对象的某些属性是否等于对应的standardValue

    我不想从standardValue加载Db来检查这种相等性,所以我决定在HashValue类中定义NominalValue属性:

    public class NominalValue
    {
       public int Id {get; set;}
       public string ElementName {get; set;}
       public decimal From {get; set;}  //<-- 1st parameter for generating hash value
       public decimal To {get; set;}    //<-- 2nd parameter for generating hash value
       public bool Enable {get; set;}   //<-- 3rd parameter for generating hash value 
       public DateTime CreationDate {get; set;}
       public int StandardValueId {get; set;}  
       public string HashValue {get;set;}      //<-- this property added
    } 
    

    当用户使用nominalValue属性填充standardValue属性时,我会根据3个属性(FromToEnable)计算其值并保存使用其他属性,当我检查nominalValue是否填充standardValue时,我会计算FromToEnable的哈希码并进行比较结果为HashValue(而不是从standardValue加载Db

    是否有任何基于3个属性值(FromToEnable)计算唯一哈希码的机制?

1 个答案:

答案 0 :(得分:2)

您可以尝试这样做:

private int GetHashValue() {
    unchecked 
    {
        int hash = 17;
        //dont forget nullity checks 
        hash = hash * 23 + From.GetHashCode();
        hash = hash * 23 + To.GetHashCode();
        hash = hash * 23 + Enable.GetHashCode();
        return hash;
    }
}

您也可以在匿名类型上使用GetHashCode方法

private int GetHashValue() {
   return new { From, To, Enable }.GetHashCode();
}