2009-08-25 7 views
12

文字列をハッシュしたいのですが、出力を整数にする必要がありますので、md5を実行することはできません。ここにいる人々は、私に啓発したいと思うかもしれない好きな数字のハッシュを持っていますか?私はPHPを使用しています。良い数値ハッシュ

ありがとうございます!

+0

?最初のものは普通は2番目のものですが、比較的高いコストです。 – RBarryYoung

+17

次のページには、効率的で最小限の衝突を示す汎用ハッシュ関数のいくつかの実装があります:http://partow.net/programming/hashfunctions/index.html –

答えて

3

たぶんこれはあなたのために十分である:

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

EDIT:他の類似の代替、

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

は、MD5の出力は、ちょうどほとんどありとあらゆるハッシュと同じように、数あります。これは通常、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 
関連する問題