2009-08-25 26 views
12

Bir dizeye hash bakıyorum ama tamsayı olmak için çıktıya ihtiyacım var, bu yüzden md5 yapamıyorum. Buradaki insanlar, beni aydınlatmak isteyebilecekleri herhangi bir favori sayısal karmaşaya sahipler. PHP kullanıyorum.Sayısal kareler

Teşekkürler!

+0

Eğer iyi güvenlik gibi ya da iyi anahtar dağıtımı gibi "iyi" bir karma kastediyorsunuz ? İlk irade genellikle size ikinci, ama nispeten yüksek bir maliyetle verir. – RBarryYoung

+17

Aşağıdaki sayfada, genel amaçlı karma işlevlerin etkili ve çok az çarpışma sergilediği birkaç uygulaması vardır: http://partow.net/programming/hashfunctions/index.html –

cevap

3

Belki bu sizin için yeterince iyi:

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

DÜZENLEME: Diğer benzer alternatif, MD5 çıkış sadece hemen hemen her akla gelebilecek karma olduğu gibi, bir numara olduğunu

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

. Bu, genellikle onaltılık olarak ifade edilen bir sayıdır. Size uygun olan herhangi bir karma algoritmayı kullanın, sondan istediğiniz kadar çok bit doğrayın ve bu bitleri bir sayı olarak ele alın. Herhangi bir iyi karma, son değeri (veya ilk veya orta) n bitleri, tüm değer olarak eşit olarak dağıtılmış olacak.

+3

Evet, Ancak, karma sonucun kesilmesi veya katlanması, Hem güvenlik hem de dağıtım açısından gevşek kalite. – nik

+2

Eğer hash iyi ise (eğer ideal bir hash için uygun bir yaklaşımsa), o zaman onu kestiğinizde eşit olarak iyi dağılmış olacak ve azaltılmış tuş boşluğuna ne olduğu dışında herhangi bir güvenliği kaybetmeyeceksiniz. – hobbs

0

Sen ondalık sayı içine ve tersi onaltılık değiştirmek için base_convert kullanabilirsiniz. Tamsayıları (bir dize olarak) hex'e dönüştürmek istiyorsanız, 32 bitlik sayılarla veya daha azıyla sınırlıyım (PHP_INT_MAX). Ben mevcut sağlamalarının Of

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 

, bunlar ondalık ve onaltılık arasında dönüştürebilirsiniz olanları şunlardır:

adler32 
c1015d04 
3238092036 
c1015d04 
yes 

crc32 
accf8b33 
2899282739 
accf8b33 
yes 

crc32b 
d87f7e0c 
3632233996 
d87f7e0c 
yes