簡體   English   中英

C#GetHashCode實現

[英]C# GetHashCode Implementation

public override int GetHashCode()
{
    return Word.GetHashCode();
}

真的一樣

public override int GetHashCode()
{
    return (int) Word.GetHashCode() * 7;
}

關於獨特性?

WordString類型

編輯:我忘了說,哪個更好地在程序中實現,選項1或2?

顯然, Word.GetHashCode()實現中的任何沖突都將導致(int) Word.GetHashCode() * 7實現中的沖突,因為將相同的數字相乘會產生相同的結果。

一個更有趣的問題是,第一個實現中的非沖突哈希碼是否會導致第二個實現中的沖突。 事實證明答案是“否”,因為int7的范圍是互質數。 因此,乘法在消除溢出后會產生唯一的映射。

您可以使用兩個字節的哈希碼運行小型測試,以查看會發生什么:

const int Max = 1<<16;
var count = new int[Max];
for (int i = 0 ; i != Max ; i++) {
    count[(i * 7) & (Max-1)]++;
}
var notOne = 0;
for (int i = 0 ; i != Max ; i++) {
    if (count[i] != 1) {
        notOne++;
    }
}
Console.WriteLine("Count of duplicate mappings found: {0}", notOne);

該程序將哈希碼值i映射到7 * i 2 16為模,並驗證該范圍內的每個數字是否恰好產生一次。

Count of duplicate mappings found: 0

演示。

如果將7替換為偶數,結果將大不相同。 現在,原始集中的多個哈希碼將被映射到目標集中的單個哈希碼。 如果您記得乘以偶數始終會使最低有效位為零,則可以直觀地理解這一點。 因此,根據偶數可以除以2的次數,一些信息會丟失。

哪一個更好?

沒有區別。

注意:以上假設您忽略整數溢出。

由於您不是在unchecked上下文中運行代碼,因此后者會在發生溢出的任何時間引發異常,這很可能會發生(哈希范圍的6/7會拋出,因此通常均勻分布的哈希代碼具有約有6/7的機會拋出異常)。

暫無
暫無

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

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