2009-08-25 3 views
12

문자열 해시를 찾고 있는데 출력이 정수가되어야 md5를 할 수 없습니다. 여기 사람들은 나에게 계몽하고 싶은 마음에 드는 숫자 해시를 가지고 있습니다. PHP를 사용하고 있습니다.좋은 숫자 해시

감사합니다.

+0

당신은 좋은 보안 또는 좋은 키 분배에서와 같이 "좋은"해시를 의미합니까 ? 첫 번째는 보통 두 번째이지만 상대적으로 높은 비용으로 제공합니다. – RBarryYoung

+17

다음 페이지는 효율적이고 최소한의 충돌을 보이는 범용 해시 함수의 여러 구현을 가지고 있습니다 : http://partow.net/programming/hashfunctions/index.html –

답변

3

은 어쩌면이 당신을 위해 충분 :

echo sprintf('%u', crc32($string)); 

편집 : 기타 유사한 대안, MD5의 출력은 단지 거의 상상할 수있는 모든 해시와 마찬가지로 숫자입니다

echo hash('adler32', $string); 
4

. 이것은 보통 16 진수로 표현되는 숫자입니다. 편리하게 사용할 수있는 해시 알고리즘을 사용하고 끝에서 원하는만큼 많은 비트를 자르고 해당 비트를 숫자로 처리하십시오. 모든 좋은 해시는 전체 값만큼 균등하게 분산 된 마지막 (또는 첫 번째 또는 중간) n 비트를 갖습니다.

+3

예, 그러나 해시 결과를 잘라내거나 접을 경우 보안 및 배포면에서 느슨한 품질. – nik

+2

해시가 양호한 경우 (이상적인 해시에 대한 적절한 근사값 인 경우), 키를 자르면 똑같이 잘 분산되어 키 스페이스 감소로 인한 보안을 잃지 않습니다. – hobbs

0

당신은 십진수로 그 반대의 진수를 변경하는 base_convert를 사용할 수 있습니다. 정수 (문자열)를 16 진수로 변환하려면 32 비트 숫자 이하로 제한하십시오 (PHP_INT_MAX). 내가 가진 가능한 해시의

php -r 'foreach (hash_algos() as $hash) { echo $hash, "\n", $a = hash($hash, "test"), "\n", $b = base_convert($a, 16, 10), "\n", $c = base_convert($b, 10, 16), "\n", ($c === $a ? "yes" : "no"), "\n\n"; }' > hashes.txt 

이 내가 진수와 진수 사이의 변환을 할 수있는 사람은 다음과 같습니다

adler32 
c1015d04 
3238092036 
c1015d04 
yes 

crc32 
accf8b33 
2899282739 
accf8b33 
yes 

crc32b 
d87f7e0c 
3632233996 
d87f7e0c 
yes 
관련 문제