2012-07-20 15 views
2

Data.Unique.hashUnique用於從一個Unique值獲得的幾乎唯一Int爲什麼Data.Unique的值在被暴露之前需要被散列?

hashUnique :: Unique -> Int 
#if defined(__GLASGOW_HASKELL__) 
hashUnique (Unique i) = I# (hashInteger i) 
#else 
hashUnique (Unique u) = fromInteger (u `mod` (toInteger (maxBound :: Int) + 1)) 
#endif 

爲什麼不Data.Unique報價爲獲得真正獨特的價值觀像getUnique的功能?

getUnique :: Unique -> Integer 
getUnique (Unique i) = i 

這是圖書館發展過程中的疏忽嗎?我們可以將這樣的功能添加到Data.Unique中嗎?有很多情況下需要真正的唯一值。

+0

爲什麼你需要獲得一個'Int'或'Integer'。爲什麼不直接使用'Unique'(這是真正獨特的)? – kosmikus 2012-07-20 09:10:28

+0

因爲我最終需要打印它。 – Casini 2012-07-20 09:15:44

回答

1

Data.Unique值並非真正獨特。如果你檢查了源代碼,你會發現受保護的構造函數只是用一個計數器遞增一個TVar,每個唯一值只有下一個計數器值。所以你會得到一個Unique 1然後Unique 2等,但你可能已經知道這一點。

因爲整數都是遞增的順序,以及Integer的哈希簡單地存儲在Int其積分值,你永遠不會得到哈希衝突長達一個Int的限制(在64位機器上,一Int可以具有18,446,744,073,709,551,615個不同的值)。所以,你基本上永遠不會碰到哈希碰撞。

Unique值保證對於程序會話是唯一的。就是這樣。不能保證在各個Universe中可打印或可重用。如果您需要可打印的通用唯一值,則應使用Universally Unique Identifiers

+0

我知道Unique的語義和它的目的。無論如何我的問題是有效的爲什麼圖書館在不需要時限制我使用'maxBound :: Int'唯一值? – Casini 2012-07-20 10:45:03

+1

爲什麼'Unique's定義了散列值的唯一原因是它們可以被散列,並且在'HashMap'中用作鍵。爲什麼'hashString'函數返回一個'Int'而不是'Integer'包含所有'String'字節?因爲這不是'hashString'函數的目的;它應該散列字符串。爲什麼沒有'uniqueToInteger'函數**對** Unique's也**是因爲它在內部使用Integer是一個實現細節。圖書館開發人員應該自由切換到'ByteString's而不是破壞代碼。 – dflemstr 2012-07-20 10:49:53

+0

有些情況下,有無限數量的唯一值是有用的(例如,考慮長時間運行的服務器進程)。 'Data.Unique'庫有可能填補這一角色,但目前情況並非如此。我有興趣將這個功能添加到庫中,或者反對它的一個很好的理由。 – Casini 2012-07-20 11:01:33

相關問題