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中吗?在许多情况下,需要真正的唯一值。
答案 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。