2012-02-13 1 views
3

どのようにしてhaskellで文字列をハッシュして、多かれ少なかれ一意のハッシュ値を得ることができます。たとえば、各文字列に固有の整数を作成しますか?

hash:: String -> Integer 

>hash "foo" 
1234123412 
>hash "bar" 
5938454 

これらの行に沿ったものはありますか?私はhaskellのハッシュに精通していないので、どんな助けもありがとう!ありがとう。

+0

文字列をベースmaxBound :: Charの数値として扱います。 – augustss

答えて

7

Hackageのhashableパッケージを使用できます。これは、文字列を含む標準タイプの数、のためにハッシュ関数を提供します。

Prelude Data.Hashable> hash "foo" 
653367 
Prelude Data.Hashable> hash "bar" 
649056 

あなた自身を実装する場合は、ハッシュ関数は、通常は倍として表現するのは簡単です。これらのハッシュ関数は、シンプルかつ高速であることを意味していることを

hash :: String -> Int 
hash = foldl' (\h c -> 33*h `xor` fromEnum c) 5381 

注:たとえば、ここでDJB2ハッシュのバリアントです。もっと複雑なハッシュ関数を探しているなら、cryptohashパッケージで選択項目を見つけることができます。

+0

ありがとう、それは素晴らしいですが、もう少し "ランダムな"ものがありますか?現在、 "agent1"と "agent2"の場合、連続した数字を生成します。:-( – drozzy

+3

ハッシュを広げて、それぞれのfromEnum cを大きなプライム(モジュロ2^32)と掛け合わせることができます。 –

+0

Nevermind 、私は自分のrandomR関数のシードとしてハッシュを使用していることを認識しました。 – drozzy

関連する問題