2013-05-31 72 views
0

我需要爲封裝這些數據的對象構建一個散列(作爲一個無符號的32位整數)。爲自定義結構生成唯一的哈希值?

Entry { 
    uint8 r; 
    uint8 g; 
    uint8 b; 
    bool empty; 
    uint8 count; 
} 

散列對於每個實例必須是唯一的,除非實例相同。兩個實例相等,當且僅當:

  • 數在這兩種情況下等於

  • R,G,B都等於OR空的設置兩個實例

散列將用於hashma PS和其他容器,所以它可能會被頻繁地調用。散列生成需要很快。

我考慮CCCERRRGGGBBB,其中:

  • CCC/RRR/GGG/BBB:計數/ R/G/B上3位數字
  • E:1,如果空被設置,否則爲0

但是這個數字超出了範圍。

有什麼想法?

+5

請注意:絕大多數散列並不能保證絕對唯一性,但足夠獨特,以至於驗證精確匹配的額外時間可以忽略不計,因爲它基本上是O(1)。 – BlargleMonster

+1

確保散列對每個實例都是唯一的,尤其是當實例的大小大於散列的大小時(如在您的情況中),您很難或無法保證:您試圖將每個33位值合併到一個獨特的32位變量。 – iamnotmaynard

+1

在你的情況下,唯一性在數學上是不可能的(因爲在32位uint中有更多不同的Entry值) –

回答

2

你將有一個艱難的時間編碼的信息33位到32位

if (empty == false) 
    return count ~ r ~ g ~ b 
else 
    return count ~ 0 

你得到一個重疊,這是當空是假的R,G,B都爲0 - 這當空爲真且r,g,b爲0時將是相同的散列。

沒有進一步的假設,這是最好的可以完成的。

+1

非常優雅。另一個想法是放棄計數的最高位,並用布爾替換它。那麼重疊只會在'count> 127'和'count <= 127'之間。 –

+0

很好的回答!我覺得有點愚蠢,我沒有意識到我的33位數據不能適用於32位......計數重疊對我來說是最好的選擇,count永遠不會超過100.它可能甚至不會是超過50。謝謝! – LodeRunner