Bunu yapabilirsiniz döngüler, String bitiştirmelerini veya temiz ve okunması kolay bir şekilde rand () için birden fazla görüşme gibi without kirli / costy şeyler. Ayrıca, kullanımı daha iyidir mt_rand()
:
function createRandomString($length)
{
$random = mt_rand(0, (1 << ($length << 2)) - 1);
return dechex($random);
}
Eğer herhangi bir durumda tam uzunluğuna sahip dize gerekiyorsa, sadece ped sıfır ile onaltılık sayı:
function createRandomString($length)
{
$random = mt_rand(0, (1 << ($length << 2)) - 1);
$number = dechex($random);
return str_pad($number, $length, '0', STR_PAD_LEFT);
}
"Teorik backdraw" Eğer PHPs yetenekleri sınırlı olduğu, - ama bu en zaten bunun üzerinden gidelim ;) bu durumda daha felsefi bir konudur:
- PHP bu gibi yaparken bir onaltılık sayı olarak temsil edebilir ne de sınırlıdır. Bu, bu PHPs için sınırlama 4.294.967.295 olması gereken bir 32 bit sistemi üzerinde
$length <= 8
at least olacaktır.
- PHPs rasgele sayı üreteci de bir maksimum vardır.
mt_rand()
at least 32bit sistemde, bu 2.147.483.647 olması gerekmektedir
- Yani teorik olarak 2.147.483.647 kimlikleri ile sınırlıdır.
Konuya geri geliyor - sezgisel do { (generate ID) } while { (id is not uniqe) } (insert id)
bir dezavantajı ve karanlığa düz sürücü olabilir, olası bir kusur vardır ...
Drawback: doğrulama karamsar. Bu gibi yapmaya always veritabanının bir kontrol gerektirir. (Senin 10k girişleri için 5 örnek uzunluğu için) yeterli keyspace olacak olması oldukça muhtemel nedeni çarpışmalar sık sık, o comparably daha az kaynak sadece sadece bir durumunda verileri saklamak ve yeniden denemek için denemek için alıcı olabileceği gibi UNIQUE KEY hatası.
Flaw: User A henüz alınmamıştır olarak doğrulanmış olur bir kimliği alır. Ardından kod veri eklemek için çalışacağız. Ama bu arada, User B aynı döngüye girdi ve User A henüz depolanır ve bu kimliği hala özgür değildi, çünkü ne yazık ki, aynı rasgele sayı, alır. Şimdi sistemi depolar ya User B veya User A, ve ikinci kullanıcı saklamak için çalışırken, zaten arada diğer bir var - aynı ID'ye sahip.
Herhangi bir durumda bu istisnayı işlemek ve yeni oluşturulan kimliği ile yeniden denemek ekleme gerekir gerekir. (Yeniden girmeniz gerekir ki) kötümser kontrol döngü korurken bu ekleme oldukça çirkin ve kod takip etmek zor neden olur. Fortunately the solution to this is the same like the one to the drawback: Sadece ilk etapta bunun için gidin ve verileri depolamak için deneyin. UNIQUE KEY hata durumunda sadece yeni kimliği ile yeniden deneyin.