为什么Data.Unique中的值需要在公开之前进行哈希处理?

时间:2012-07-20 08:09:27

标签: haskell unique ghc base

Data.Unique.hashUnique用于从Int值中获取几乎唯一的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中吗?在许多情况下,需要真正的唯一值。

1 个答案:

答案 0 :(得分:1)

Data.Unique值并非真正独特。如果检查源,您将看到受保护的构造函数只是使用计数器递增TVar,并且每个唯一值只具有下一个计数器值。所以你会得到Unique 1然后Unique 2等等。但你可能已经知道了。

因为整数的顺序递增,而Integer的哈希值只是存储在Int中的整数值,所以你永远不会得到哈希冲突,直到Int的极限。 1}}(在64位计算机上,Int可以有18,446,744,073,709,551,615个不同的值)。所以,你基本上永远不会得到哈希冲突。

保证Unique值对于程序会话是唯一的。这就是全部。它不能保证可以跨Universe打印或重复使用。如果您需要可打印的通用唯一值,则应使用Universally Unique Identifiers