生成独特的可比值

Joe*_*ams 11 haskell ghc

什么是生成临时密钥的好方法,其中每个密钥对于程序是唯一的?理想情况下,形式的行为:

newKey :: IO Key
Run Code Online (Sandbox Code Playgroud)

这样:

do a <- newKey
   b <- newKey
   return (a == b)
Run Code Online (Sandbox Code Playgroud)

总是返回false.此外,应该可以Key在有效的关联容器(例如a Map)中使用.

例如,这可用于维护支持随机插入和删除的事件处理程序集合:

Map Key EventHandler
Run Code Online (Sandbox Code Playgroud)

我知道的选项:

mallocForeignPtrBytes 1似乎是我最好的选择.我想我可以通过newPinnedByteArray#直接使用GHC的primop 来提高效率.

还有更好的选择吗?这种mallocForeignPtrBytes做法是否因某些非显而易见的原因而存在缺陷?

dfl*_*str 11

如果您不想向项目添加任何其他依赖项,则可以在基础包中使用Data.Unique.

在内部,系统使用s TVar(它依赖于GHC的STM系统)Integers,这样每次调用时newUnique,TVar都会以原子方式递增,而new Integer会存储在不透明Unique数据类型中.因为TVars不能同时被不同的线程修改,所以它们保证Uniques按顺序生成,并且它们实际上必须是唯一的.


Ant*_*ony 5

hackage有几个相关的包.在并发供应包看起来是相当精心设计.