mysql insert rastgele benzersiz 8 karakter

5 Cevap php

hello i'm using PHP , Mysql i have a table with 3 fields (( ID , Username , PID )).

i 8 benzersiz karakter dizesi içeren 'PID alan' istiyorum.

benim çözüm PHP rasgele dize oluşturmak ve o varsa eğer, o zaman başka bir dize üretecektir var olup olmadığını kontrol etmektir.

böyle mysql tetikleyici veya sth gibi işlem zaman kazandıracak daha iyi bir çözüm var mı?

5 Cevap

Bu, rastgele bir 8 karakter dizesi verecektir:

substr(str_pad(dechex(mt_rand()), 8, '0', STR_PAD_LEFT), -8);

Burada bulunan: http://www.richardlord.net/blog/php-password-security

Veya adı alanı benzersiz olup olmadığını da kullanabilirsiniz:

substr(md5('username value'), 0, 8);

Son derece düşüktür rağmen, özellikle md5 için, ne durumda benzersiz bir dize garanti, bu yüzden muhtemelen böyle bir şey yapardı:

// Handle user registration or whatever...

function generatePID($sUsername) {
    return substr(md5($sUsername), 0, 8);
}

$bUnique = false;
$iAttempts = 0;

while (!$bUnique && $iAttempts < 10) {
    $aCheck = $oDB->findByPID(generatePID("username value")); // Query the database for a PID matching whats generated
    if (!$aCheck) { // If nothing is found, exit the loop
        $bUnique = true;
    } else {
        $iAttempts++;
    }
}

// Save PID and such...

Muhtemelen ... Sadece benzersiz durumlarda belki 2 sorgusu 'onay' ve benzersiz bir dize sağlayacak 1 doğuracak.

Karakterleri rastgele olması gerekiyor? Ya da sadece benzersiz? Sadece benzersiz olması gerekiyorsa, bir zaman damgası kullanabilirsiniz. Zamanında değerini oturtmakta bir teklik sağlayacaktır.

Başka bir yol giderseniz, size benzersiz bir değer ile sona kadar veritabanı karşı oluşturulan değerini kontrol etmek gerekir.

Neden bu doğru şekilde yapmak ve UUIDs her zaman benzersiz (aka Guıd), değillerse ya da kontrol etmek gerek kullanmayın. Bu 36 karakter olabilir, ama standart DAMGA veriler üzerinde disk alanı ve artış hızı kaydeder HEX olarak saklayarak parası olsun.

Sen PHP doc for functions that do this üzerine yorumlarını okuyabilirsiniz.

Eğer PID değeri için 8 karakter hazırsınız, o zaman dize oluşturmak ve zaten var olmadığını kontrol için bir şey gerekir.

$alphabet = range('A','Z');

// get all the PIDs from the database
$sql = "select PID from mytable";

// save those all to an array
$pid_array = results of query saved to array

shuffle($alphabet);
$pid_offer = array_slice($alphabet,0,8);

while(in_array($pid_offer, $pid_array)){
    shuffle($alphabet);
    $pid_offer = array_slice($alphabet,0,8);
}

// found uniuqe $pid_offer...

yarış koşulları hala var.

Dize rastgele olmak zorunda değilse, o zaman muhtemelen bir otomatik artım tamsayı olduğu, kimlik değeri kullanın ve 10000000 bunun için sayımı başlatın.

Sonra sadece yapmak basit bir A = 1, B = 2, bu sayı basamak üzerinde C = 3 vs yedek sizin dize oluşturmak için.

Sizin kilometre değişebilir.

- Mark

Böyle bir şekilde MySQL 8 karakter benzersiz bir dize oluşturabilir

CAST(MD5(RAND()) as CHAR(8))