Какой хороший способ генерировать специальные клавиши, где каждый ключ уникален для программы? В идеале действие вида:
newKey :: IO Key
такое, что:
do a <- newKey
b <- newKey
return (a == b)
всегда возвращает false. Кроме того, должно быть возможно использовать Key
в эффективном ассоциативном контейнере (например, a Map
).
Это может быть использовано, например, для поддержки коллекции обработчиков событий, поддерживающих случайную вставку и удаление:
Map Key EventHandler
Параметры, о которых я знаю:
-
newIORef
()
: Удовлетворяет инварианту выше, но IORef не имеет экземпляра Ord. -
malloc
: Быстро, аPtr ()
имеет экземпляр Ord, но результат не является сборкой мусора. -
newStablePtr
()
: не собран мусор, аStablePtr
не имеет экземпляраOrd
. -
newIORef
() >>=
makeStableName
: должны удовлетворять инварианту выше и сбор мусора, но сложнее в использовании (требуется, чтобы я использовал хеш-таблицу). -
mallocForeignPtrBytes
1
: Удовлетворяет оба критерия, но эффективен ли он?
mallocForeignPtrBytes 1
кажется моим лучшим вариантом. Я полагаю, что я мог бы сделать его немного более эффективным, используя непосредственный приём GHC newPinnedByteArray#
.
Есть ли лучшие варианты? Является ли подход mallocForeignPtrBytes
ошибочным по какой-то неочевидной причине?