我尝试生成一个进程,以便使用rand_md5函数在表中创建大约5000个唯一键。有时它会给出一个重复的"独特的"关键约束违规。我该怎么做才能解决这个问题?
function rand_md5($length) {
$max = ceil($length / 32);
$random = '';
for ($i = 0; $i < $max; $i ++) {
$random .= md5(microtime(true).mt_rand(10000,90000));
}
return substr($random, 0, $length);
此函数在1到5000次迭代(例如)的for循环内调用。
任何想法如何解决这个问题?
答案 0 :(得分:1)
您必须跟踪分配的值,并检查每个新生成的值是否已被使用。
function rand_md5($length) {
$max = ceil($length / 32);
$random = '';
for ($i = 0; $i < $max; $i ++) {
$random .= md5(microtime(true).mt_rand(10000,90000));
}
return substr($random, 0, $length);
}
$randoms = [];
do {
$rnd = rand_md5($length);
} while( in_array( $rnd, $randoms ) );
$randoms[] = $rnd;
答案 1 :(得分:0)
第一个建议,使用库更好地生成唯一的令牌,即uuid()。
其次,确保您的数据库列足够长以存储字符串。虽然您可能会与算法产生冲突,但通常暗示您(或数据库)正在截断字符串。
答案 2 :(得分:0)
使用openssl_random_pseudo_bytes
:
function randomKey($length) {
//Need a length divisible by two.
$length = intval($length);
if (!$length || $length % 2)
return false;
//Get random bytes & hex encode.
$key = openssl_random_pseudo_bytes($length / 2);
return (is_string($key) ? bin2hex($key) : false);
}
答案 3 :(得分:-1)
我认为它可以帮到你
function rand_md5($length) {
$random = md5(microtime(true).mt_rand(10000,90000));
$random = str_shuffle($random);
return substr($random, 0, $length);
}