簡體   English   中英

結合字符串哈希和long哈希

[英]Combining Hash of String and Hash of Long

我有以下java類:

public class Person{
   String name;  //a unique name
   Long DoB;     //a unique time
   .
   .
   .
   @Override
   public int hashCode(){
     return name.hashCode() + DoB.hashCode();
   }

}

我的hashCode方法是否正確(即,它將返回所有組合的唯一編號)。

我覺得我在這里想念什么。

您可以讓java.util.Arrays為您做這件事:

return Arrays.hashCode(new Object[]{ name, DoB });

除了顯而易見的以外,您可能還想實現equals方法...

  • 對兩個哈希碼求和具有int溢出的很小的風險
  • 總和本身似乎是提供唯一哈希碼的較弱方法。 相反,我將嘗試按位操作並使用種子。

您可能還想使用更流暢,更NPE防彈的工具,例如Google Guava

@Override
public int hashCode(){
    return Objects.hashCode(name, DoB);
}

@Override
public boolean equals(Object o) {
    if ( this == o ) {
        return true;
    }
    if ( o == null || o.getClass() != Person.class ) {
        return false;
    }
    final Person that = (Person) o;
    return Objects.equal(name, that.name) && Objects.equal(DoB, that.DoB);
}

編輯:

IntelliJ IDEA和Eclipse可以生成更有效的hashCode()equals()

通常,哈希碼的構建方式如下:

   @Override
   public int hashCode(){
     return name.hashCode() ^ DoB.hashCode();
   }

但是使用哈希碼方法時要記住的重要一點是使用它。 哈希碼方法的使用是將不同的對象放在使用哈希碼的哈希表或其他集合的不同存儲桶中。 這樣,沒有一種方法可以在較低的運行時間為不同的對象提供不同的答案,但是不必對每個項目都有所不同,盡管這樣做會更好。

在存儲或操作實例時,其他代碼會使用此哈希-旨在將這些值均勻分配給各種輸入,以便在群集中使用。 此屬性對於哈希表和其他基於對象的計算哈希值將對象存儲在組(“存儲桶”)中的數據結構的性能很重要

此方法的重寫實現的一般約定是,它們的行為方式與相同對象的equals()方法一致:給定對象必須一致地報告相同的哈希值(除非更改了該值,以便不再使用新版本)被認為與舊的“相等”),並且equals()表示相等的兩個對象必須報告相同的哈希值。

請參閱Bloch的有效Java#9。

但是,您應該從一個初始值開始(以便隨后的零值有效),然后將與結果相乘的字段與一個乘數相結合,以便順序有效(以使相似的類具有不同的哈希值)。

同樣,您將不得不對待長字段和字符串之類的東西有所不同。 例如,長期:

(int) (field ^ (field>>>32))

因此,這意味着:

@Override public int hashCode() {
   int result = 17;
   result += name.hashCode() == null ? 0 : name.hashCode();
   result = 31 * result + (int) (DoB ^ (DoB >>> 32));
   return result;
}

31有點魔術,但是奇數質數可以使編譯器更容易優化數學以進行減法運算。 (或者您可以自己進行移位減法,但是為什么不讓編譯器來做。)

您的哈希碼實現是正確的。 如果您遵循其他人提出的任何建議,可能會更好,但它滿足hashCode的約定,並且碰撞的可能性不大,盡管可能會降低。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM