2012-02-13 4 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 

자신을 구현하려면, 해시 함수는 일반적으로 배로 표현하기 쉽다. 예를 들어, 다음은 DJB2 해시의 변형입니다.

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

이러한 해시 함수는 간단하고 빠른 의미입니다. 보다 복잡한 해시 함수를 찾고있는 경우 cryptohash 패키지에서 선택 항목을 찾을 수 있습니다.

+0

고마워, 그거 대단하지만, 좀 더 "무작위로"보이는 무언가가 있니? 현재 "agent1"과 "agent2"의 경우 연속적인 숫자를 생성합니다. :-( – drozzy

+3

각'fromEnum c '에 largish 프라임 (modulo 2^32, 말)을 곱하면 피할 수 있습니다. –

+0

Nevermind , 난 그냥 난 내 randomR 함수에 대한 씨앗으로 해시를 사용하여 실현, 그래서 좋은거야! – drozzy

관련 문제