2011-01-28 14 views
7

En fazla 20 karakter uzunluğunda alfasayısal bir dize çıkaran bir karma algoritmasına ihtiyacım var. "Alfasayısal" için [a-zA-Z0-9] demek istiyorum.20 karakterlik alfasayısal çıkışlı karma algoritma max

Girişler alternatifte

bu sınırlamalara sahip bir dizeye SHA1 veya MD5 karma dönüştürmek için bir yol yoktur kurallı biçimde UUID s (örnek 550e8400-e29b-41d4-a716-446655440000) mi?

Teşekkürler.

DÜZENLEME kriptografik güvenli olması gerekmez mi. Çarpışmalar verileri yanlış yapar, ancak ara sıra gerçekleşirse, onunla yaşayabilirim.

DÜZENLEME 2

MD5 veya SHA1 kısaltılıyor çarpışmalar çok sık gerçekleşmesi olsaydı bilmiyorum. Şimdi, 20 karaktere bir MD5 değeri veya bir SHA1 değeri kırpmanın daha iyi olup olmadığını merak ediyorum.

+0

Bu karma değerler için istenen özelliklerin var mı? Kriptografik olarak güvenli mi yoksa bir karma masa için yeterince iyi mi? – templatetypedef

+1

SHA1 veya MD5 hash dizesini onaltılı (veya base64) olarak yazdırabilir ve gerekiyorsa 20 karaktere kesebilir misiniz? –

+1

Amacınız nedir? SHA1 hash'ının 20 karakterlik bir alt dizgisi alması işe yaramıyor mu? –

cevap

13

Sadece GUID'nin karmasından ihtiyacınız olmayan karakterleri kırpın. İyi bir karma işleviyle, karma parçanın herhangi bir kısmının öngörülemezliği parçanın büyüklüğü ile orantılıdır. İsterseniz, standart hex base 16 yerine base 32 kodlayabilirsiniz. Bu, karakter başına entropi önemli ölçüde geliştirmeyeceğini unutmayın (sadece% 25).

Kriptografik olmayan kullanımlar için, MD5, SHA1 veya SHA2'yi kırpıp kesmedığınız önemli değildir. Entropide hiç göze çarpan eksiklik yoktur.

+2

Teşekkürler. 1 milyon UUID üretmeye ve SHA1 hex'in ilk 20 karakterini almaya çalıştım. Çarpışma yok. Test komut dosyası burada: https://gist.github.com/800132 – Giacomo