:0..2^32-1 aralığında Perl üreten değerlerinde hızlı bir dize sağlama işlevi
- Girdi: tanımsız Unicode dizesi uzunluğu (
$string
) - Çıkış: işaretsiz bir tamsayı (
$hash
),0 <= $hash <= 2^32-1
sahip olduğu için
Pseudo-kodu (0 4 baytlık MySQL işaretsiz int boyutunu eşleşen 4294967295, üzere)
sub checksum {
my $string = shift;
my $hash;
... checksum logic goes here ...
die unless ($hash >= 0);
die unless ($hash <= 4_294_967_295);
return $hash;
}
İdeal sağlama fonksiyonu çalıştırmak için hızlı olmalı ve hemen hemen eşit çakışmaları önlemek için hedef alanı (0
.. 2^32-1
) değerleri üretmelidir. Bu uygulamada rastgele çarpışmalar tamamen ölümcül değildir, fakat açıkçası onları mümkün olduğu ölçüde engellemek istiyorum.
Bu gereksinimler verildiğinde, bunu çözmenin en iyi yolu nedir?
sindirir? Tamsayı neden önemlidir? Sindirimi bir ip olarak saklamak zorunda kalsanız bile, MD5 gibi bir şeyi kullanmayla ne dersiniz? –
"Tüm olası dizelerle çarpışmalardan kaçınmak istiyorsunuz" - Hayır, soruda belirtildiği gibi "mümkün olduğu ölçüde onları önlemek istiyorum". – knorv
"Neden bir tamsayı kullanıyor?" - Soruda belirtildiği gibi, sağlama toplamı "4 byte MySQL imzasız int" olarak saklanır. – knorv