haskell中UUID的确定性生成

问题描述 投票:0回答:3

我正在寻找一种确定性的方式来从数据类型获取UUID,就像我总是得到相同的UUID ...

myItem -> UUID

haskell
3个回答
3
投票

我认为您不需要UUID。顾名思义,UUID普遍具有唯一性,因此您不应两次获得相同的UUID(或至少可以忽略这种情况的发生)。

您可能需要的是hashing method,Haskell当然支持大多数这些功能

---编辑---

[this问题,了解一种从文件中计算哈希的方法。我认为您可以轻松地使其适应您的需求。


1
投票

选择myItem足够独特的属性集-生成哈希-您获得了UUID。冲突哈希的几率当然取决于哈希算法和您选择的属性的质量。


0
投票

只需使用至少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
© www.soinside.com 2019 - 2024. All rights reserved.