2011-08-11 39 views
1

我正在實現數據序列化,並遇到一個問題。 我有:GetHashCode足夠強大還是需要另一個散列函數?

  • 4字節字段:
    • 值的範圍在0-255
    • 值的範圍在0〜4
    • 值的範圍在0-255
    • 值的範圍在0〜100
  • and 1 int field(only positive values)

我有一個想法,convet所有字節數組(lenght 8)或int數組(lenght 2),並獲得C#的GetHashCode方法

的GetHashCode是足夠強大的標識符這個數據使用? 或者有人有更好的主意,也許?

EOG

回答

3

的GetHashCode並不意味着創建一個唯一的標識符 - 它的主要用途是在哈希數據結構分配值到桶(如哈希表) - 見http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/。當我需要一個對象的唯一標識符時,由於某種原因,對象本身不提供一個,所以我通常只會回退GUID。在C#中生成它們並不重要,並且保證在你所做的任何事情範圍內都是唯一的。

+0

他們不保證是唯一的,它們很可能是。 – jason

1

GetHashCode純粹用於字典中的散列。由於可能的hash collisions,您不應將其用作任何標識符。它返回Int32並且對於字符串,例如顯然可能有超過2,147,483,647個唯一字符串。兩個不同的字符串可以具有相同的散列碼。話雖如此,你有兩種選擇:

1)如果你需要你的標識符來自實際值。例如,如果您需要快速判斷是否已經保留了新對象而不反序列化所有對象並將它們與所討論的對象進行比較。例如,您可以在SHA1上使用ComputeHash

2)如果您不需要從實際值中派生標識符,您可以簡單地生成Guid,如bbogovich已建議。

0

整數和長整數的GetHashCode()值(< int.MaxValue)與該值相同,但對於數組的值不穩定。所以不要使用它。

爲什麼不把整個結構轉換爲long作爲使用?

+0

不適用於'長'。 – jason

+0

當然 - b/c GetHashCode返回一個int!。 Opps :) –

相關問題