Rasgele, benzersiz, alfasayısal bir dize oluşturmak için Nasıl?PHP:
Nasıl rastgele, benzersiz bir dize sayıları kullanarak ve doğrulamak bağlantı kullanmak için mektup oluşturmak mümkün mü? Bir web sitesinde bir hesap oluşturmak ve bir bağlantı içeren bir e-posta gönderir, ve hesabınızı doğrulamak için bu bağlantıyı tıklamanız gerekiyor...Evet...onlardan biri gibi.
Nasıl bu PHP kullanarak bir tane oluşturabilirsiniz?
Güncelleme:Sadece hatırladı uniqid()
. Benzersiz bir tanımlayıcı mikrosaniye, mevcut saate göre oluşturur PHP bir işlevi var. Bunu kullanacağım sanırım.
CEVAP
Sadece aynı bu sorunu çözmek için nasıl içine bakıyordu, ama ben de benim görevim şifre alma için kullanılabilir bir belirteç olarak oluşturmak istiyor. Bu tahmin edilecek bir belirteç yeteneğini sınırlamak istiyorum anlamına gelir. uniqid
zamana dayalı olduğu için, ve php.net göre "dönüş değeri microtime biraz farklıdır()", uniqid
kriterlere uymayan. PHP openssl_random_pseudo_bytes()
şifreli olarak güvenli belirteçleri oluşturmak için yerine kullanarak önerir.
Hızlı ve kısa bir cevap
bin2hex(openssl_random_pseudo_bytes($bits))
uzunlukta alfanümerik karakterden oluşan rasgele bir dize üretir = $bits * 2. Ne yazık ki bu sadece [a-f][0-9]
bir alfabesi vardır ama işe yarıyor.
Aşağıda kriterleri (Bu Erik'in cevap uygulanan bir versiyonudur) karşılayan yapabilirim en güçlü fonksiyonu.
function crypto_rand_secure($min, $max)
{
$range = $max - $min;
if ($range < 1) return $min; // not so random...
$log = ceil(log($range, 2));
$bytes = (int) ($log / 8) 1; // length in bytes
$bits = (int) $log 1; // length in bits
$filter = (int) (1 << $bits) - 1; // set all lower bits to 1
do {
$rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
$rnd = $rnd & $filter; // discard irrelevant bits
} while ($rnd >= $range);
return $min $rnd;
}
function getToken($length)
{
$token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
$codeAlphabet.= "0123456789";
$max = strlen($codeAlphabet) - 1;
for ($i=0; $i < $length; $i ) {
$token .= $codeAlphabet[crypto_rand_secure(0, $max)];
}
return $token;
}
crypto_rand_secure($min, $max)
rand()
mt_rand
için yedek bir düşüş olarak çalışıyor. Openssl_random_pseudo_bytes $min, $max arasında rastgele bir sayı oluşturmak için kullanır.
getToken($length)
token içinde kullanmak için bir alfabe oluşturur ve o uzunlukta bir dize $length
oluşturur.
DÜZENLEME:Kaynak http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322 alıntı için ihmal ettim
Nasıl alfa-sayısal rasgele bir dize ol...
Nasıl bir dosyanın içeriğini bir Java ...
Nasıl en iyi Ruby rastgele bir dize ol...
nasıl bir dize bir akışı oluşturmak iç...
HTML olarak bir dize oluşturmak için n...