openssl_random_pseudo_bytes ile rand () replace ()

2 Cevap php

Ben bir kriptografik güçlü rasgele sayı jeneratör kullanan PHP'nin rand() fonksiyonu için bir değiştirilmesi gerekir.

openssl_random_pseudo_bytes() function güçlü rasgele sayı üreteci için size erişim alır, ama bir bayt dize olarak verileri verir. Bunun yerine, 0 ve X arasında bir tamsayı gerekir.

Ben anahtar gerekir o zaman bunun üzerinde herhangi bir matematik yapabilirsiniz, bir tamsayı openssl_random_pseudo_bytes() çıktısını almak hayal. Ben bir tamsayı bir bayt dize dönüştürme birkaç "kaba kuvvet" yollar düşünebilirsiniz, ama ben bir şey ... zarif için umuyordum.


Edit

angrychimp gelen öneri kullanarak, ben bir damla-in rand yerine () OpenSSL'yi oluşturduk. Ben kuşaklar için buraya ekleriz:

function crypto_rand($min,$max) {
    $range = $max - $min;
    if ($range == 0) return $min; // not so random...
    $length = (int) (log($range,2) / 8) + 1;
    $num = hexdec(bin2hex(openssl_random_pseudo_bytes($length,$s))) % $range;
    return $num + $min;
}

2 Cevap

Için kılavuz sayfası openssl_random_pseudo_bytes() Ben seni istiyorum bir örnek vardır. Sadece openssl_random_pseudo_bytes() ondalık dönüştürmek için, o değere hexdec() sonra, bir onaltılık sayıya dönüştürmek için çıkışında bin2hex() arayabilirsiniz.

$rand_num = hexdec(bin2hex(openssl_random_pseudo_bytes($length, $strong)));

Bu noktada size ihtiyacınız aralığında bir değer elde etmek istediklerini matematik yapabilirsiniz. Aklınıza gelebilecek diğer (dolandırıcı) seçeneği rastgele bir sayı üretmek için bir sistem komutu çalıştırmak için - mevcut çeşitli işletim sistemleri çevrimiçi için rasgele sayı jeneratörler için birkaç iyi seçenek vardır.

iyi, sadece openssl_random_pseudo_bytes sonucuna hexdec kullanmak ve size tamsayı alırsınız. O alır gibi zarif :)

print hexdec('45261b8f');

>  1160125327