簡體   English   中英

GetHashCode用於類似的值

[英]GetHashCode for similar values

我有以下課程:

public class Foo
{
    int year;       
    string name;    
    int category;   
}

以下是一些示例數據:

2012    Test1   1000
2012    Test2   1000
2012    Test3   1000    
2012    Test4   1000
2012    Test4   10
...

如果我重寫GetHashCode,則所有結果都非常相似:

return year ^ name ^ category;

int hash = 13;
    hash = hash * 33 + year.GetHashCode();
    hash = hash * 33 + name.GetHashCode();
    hash = hash * 33 + category.GetHashCode();
    return hash; 

在這種情況下,什么是好的散列函數(具有最大的分布)?

編輯:也許我對哈希桶的理解是錯誤的。 將相似的哈希值添加到同一存儲桶?

"Test1".GetHashCode() --> -1556460260
"Test2".GetHashCode() --> -1556460257

我建議的一件事是檢查String 對象是否為null

實現似乎很好,它會類似,但是哈希碼應該不同,因為主要目的是使它們位於不同的存儲桶中,從而有助於進一步的操作。

   public int hashCode() {    // Assuming year and category are String like name.
    int hash = 31;
    hash = hash * 331 + (this.year != null ? this.year.GethashCode() : 0);
    hash = hash * 331 + (this.name != null ? this.name.GethashCode() : 0);
    hash = hash * 331 + (this.category != null ? this.category.GethashCode() : 0);

    return hash;
}

我在覆蓋hashCode時學到的幾個步驟是:

  1. 選擇一個素數散列,例如5、7、17或31(素數作為散列,導致不同對象產生不同的散列碼)。
  2. 將另一個質數作為乘數,而不是哈希值是好的。
  3. 計算每個成員的哈希碼,並將其添加到最終哈希中。 對參與平等的所有成員重復此操作。
  4. 返回哈希值。

暫無
暫無

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

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