什么是生成临时密钥的好方法,其中每个密钥对于程序是唯一的?理想情况下,形式的行为:
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)
我知道的选项:
malloc:Fast,并且Ptr ()有一个Ord实例,但结果不是垃圾回收.
newStablePtr():没有垃圾收集,StablePtr也没有Ord实例.
newIORef() >>=makeStableName:应该满足上面的不变量并且是垃圾收集,但更难以使用(需要我使用哈希表).
mallocForeignPtrBytes1:满足两个标准,但它是否有效?
mallocForeignPtrBytes 1似乎是我最好的选择.我想我可以通过newPinnedByteArray#直接使用GHC的primop 来提高效率.
还有更好的选择吗?这种mallocForeignPtrBytes做法是否因某些非显而易见的原因而存在缺陷?
dfl*_*str 11
如果您不想向项目添加任何其他依赖项,则可以在基础包中使用Data.Unique.
在内部,系统使用s TVar(它依赖于GHC的STM系统)Integers,这样每次调用时newUnique,TVar都会以原子方式递增,而new Integer会存储在不透明Unique数据类型中.因为TVars不能同时被不同的线程修改,所以它们保证Uniques按顺序生成,并且它们实际上必须是唯一的.
| 归档时间: |
|
| 查看次数: |
326 次 |
| 最近记录: |