2

Data.Unique.hashUnique用于从一个值中获得一个几乎唯一IntUnique值:

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 中添加这样的功能吗?在许多情况下,需要真正独特的值。

4

1 回答 1

1

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

因为整数是按递增顺序排列的,并且 an 的哈希Integer值是存储在 an 中的整数值Int,所以您永远不会遇到达到 an 限制的哈希冲突Int(在 64 位机器上,anInt可以有 18,446,744,073,709,551,615 个不同的值)。所以,你基本上永远不会遇到哈希冲突。

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

于 2012-07-20T10:29:49.740 回答