我正在寻找一种确定性的方式来从数据类型获取UUID,就像我总是得到相同的UUID ...
myItem -> UUID
我认为您不需要UUID。顾名思义,UUID普遍具有唯一性,因此您不应两次获得相同的UUID(或至少可以忽略这种情况的发生)。
您可能需要的是hashing method,Haskell当然支持大多数这些功能
---编辑---
[this问题,了解一种从文件中计算哈希的方法。我认为您可以轻松地使其适应您的需求。
选择myItem
足够独特的属性集-生成哈希-您获得了UUID。冲突哈希的几率当然取决于哈希算法和您选择的属性的质量。
只需使用至少128位的散列对数据进行散列,然后使用Data.Binary.decode :: ByteString -> UUID
。例如:
#!/usr/bin/env cabal
{- cabal:
build-depends: base, binary, uuid-types, cryptohash-sha256, bytestring
-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeApplications #-}
import Data.Binary (decode,encode,Binary)
import Crypto.Hash.SHA256 (hashlazy)
import Data.UUID.Types
import GHC.Generics
import Data.ByteString.Lazy (fromStrict)
data Foo = Foo Int String
deriving (Eq,Ord,Show,Generic,Binary)
main :: IO ()
main = print (decode @UUID (fromStrict (hashlazy (encode (Foo 1 "hello")))))
和:
chmod +x so.hs ; ./so.hs
...
f32f6f68-2131-8c5e-babd-f7e1dc190163