使用md5创建随机密钥但有时会创建重复的密钥

时间:2015-05-13 15:58:45

标签: php

我尝试生成一个进程,以便使用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循环内调用。

任何想法如何解决这个问题?

4 个答案:

答案 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);
}