Potrzebuję zamiennik dla funkcji PHP rand()
, który używa silnego kryptografu generator liczb losowych.Zamień Rand() z openssl_random_pseudo_bytes()
Funkcja openssl_random_pseudo_bytes()
zapewnia dostęp do silnego generatora liczb losowych, ale wysyła dane w postaci ciągu bajtów. Zamiast tego potrzebuję liczby całkowitej od 0 do X.
Wyobrażam sobie, że kluczem jest uzyskanie wyniku z openssl_random_pseudo_bytes()
na liczbę całkowitą, a następnie można wykonać dowolną matematykę. Mogę wymyślić kilka "brutalnych" sposobów konwersji z ciągu bajtowego na liczbę całkowitą, ale miałem nadzieję na coś ... eleganckiego.
mt_rand() dadzą dużo lepszej jakości niż liczb losowych rand(), ale nie jest kryptograficznie silny albo. – David
uważaj, ta odpowiedź jest błędna. dokładniej część "% $ range" jest niepoprawna. Podejmij następujący scenariusz: chcesz generować liczby od 1 (włącznie) do 4 (z wyłączeniem) (ponieważ robisz max-min). $ range = 3. Teraz 3 nie dzieli się równomiernie na 2^8, co oznacza, że 1 będzie bardziej powszechne niż 3. Bądź bardzo ostrożny, chciałeś stworzyć bezpieczny generator liczb losowych, ale nieumyślnie uczynił go niepewnym, dlatego zaleca się korzystanie z istniejących wdrożeń. – chacham15
@ chacham15: Jeśli rozumiesz poprawnie, w 8-bitowym zasięgu dostaniesz 85 zestawów [1,2,3] plus pojedynczy [1,] pozostały, co spowoduje, że "1" o 1,17% będzie bardziej prawdopodobne niż " 2 "lub" 3 ", prawda? Jak rozwiązać ten problem? Oczywiście użycie * istniejącej implementacji * nie jest opcją, inaczej nie zadałbym pytania. – tylerl