2

Data.Unique.hashUniqueIntからほぼ一意のものを取得するために使用されます。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 に追加できますか? 真にユニークな値が必要な場合が多くあります。

4

1 に答える 1

1

Data.Unique値は本当に一意ではありません。TVarソースを調べると、保護されたコンストラクターが単にカウンターで a をインクリメントし、それぞれの一意の値が単に次のカウンター値を持っていることがわかります。Unique 1そのため、 aなどを取得しますUnique 2。しかし、おそらくすでにそれを知っているでしょう。

整数は昇順であり、 のハッシュはInteger単純に に格納されている整数値であるIntため、 の限界までハッシュ衝突が発生することはありませんInt(64 ビット マシンでは、Intは 18,446,744,073,709,551,615 個の異なる値を持つことができます)。したがって、基本的にハッシュの衝突が発生することはありません。

Unique値は、プログラム セッションで一意であることが保証されています。それだけです。ユニバース全体で印刷可能または再利用可能であるとは限りません。印刷可能な普遍的に一意の値が必要な場合は、Universally Unique Identifiersを使用する必要があります。

于 2012-07-20T10:29:49.740 に答える