是否有人编写了通用函数,以便可以为自定义数据类型自动生成hash
函数(使用deriving
机制)?有几次,我写了以下类型的样板,
data LeafExpr = Var Name | Star deriving (Eq, Show)
instance Hashable LeafExpr where
hash (Var name) = 476743 * hash name
hash Star = 152857
这可以自动生成:基本思路是每当添加数据时,你乘以素数,例如用列表,
hash (x:xs) = hash x + 193847 * hash xs
基本上,我想写的是
data LeafExpr = ... deriving (Hashable)
感谢大家提供的所有非常有用的回复。当我有时间时,我会尝试添加一个通用方法作为练习。就目前而言(也许sclv指的是什么?),我意识到我可以编写稍好的代码,
instance Hashable LeafExpr where
hash (Var name) = hash ("Leaf-Var", name)
hash Star = hash "Leaf-Star"
使用ghc,乘以随机素数比编辑1中的tupling好得多。与Data.HashTable的冲突从95%(非常糟糕)变为36%。代码在这里:[http://pastebin.com/WD0Xp0T1] [http://pastebin.com/Nd6cBy6G]。
答案 0 :(得分:2)
您需要多少速度?您可以使用其中一个使用模板haskell的包生成serialization代码,将值转换为二进制,然后使用hashable对二进制数组进行哈希处理。