Umumnya tidak mungkin untuk menghasilkan urutan dengan elemen unik dan acak:jelas untuk menjadi unik, algoritme harus memperhitungkan elemen yang dihasilkan sebelumnya dalam urutan, sehingga yang berikutnya tidak akan benar-benar acak.
Oleh karena itu, taruhan terbaik Anda adalah mendeteksi tabrakan dan coba lagi (yang bisa sangat mahal dalam kasus khusus Anda).
Jika Anda dibatasi hanya 7 karakter, tidak banyak yang dapat Anda lakukan di atas:
$allowed_chars = 'abcdefghijklmnopqrstuvwxz';
$allowed_count = strlen($allowed_chars);
$password = null;
$password_length = 7;
while($password === null || already_exists($password)) {
$password = '';
for($i = 0; $i < $password_length; ++$i) {
$password .= $allowed_chars{mt_rand(0, $allowed_count - 1)};
}
}
Ini pada akhirnya akan memberi Anda kata sandi baru.
Namun, dalam kasus serupa yang saya temui, saya biasanya memilih ukuran kata sandi yang lebih besar yang juga merupakan ukuran representasi hex dari fungsi hash yang populer (mis. md5
). Kemudian Anda dapat membuatnya lebih mudah untuk diri sendiri dan mengurangi kemungkinan kesalahan:
$password = time(); // even better if you have some other "random" input to use here
do {
$password = md5(time().$password);
}
while (already_exists($password));
Ini juga memiliki keuntungan tambahan bahwa ruang urutan lebih besar, sehingga akan ada lebih sedikit tabrakan. Anda dapat memilih ukuran fungsi hash sesuai dengan jumlah kata sandi yang diharapkan yang akan Anda buat di masa mendatang untuk "menjamin" kemungkinan tabrakan yang rendah dan dengan demikian lebih sedikit panggilan ke already_exists
yang mungkin mahal fungsi.