如何在php中一次生成唯一的字母数字字符串(具有预定义的长度[length=6])


How to generate unique alpha-numeric string in php at time(with predefine length [length = 6])

我正试图在php中生成6个字符长的字母数字字符串。

我收到了关于stackoverflow的问题和答案。

stackoverflow 上的shorturl

php中生成随机字符串,但不是唯一字符串

在php中生成随机、唯一的字符串,但在使用6长度的字符串时不是唯一的

我可以一次生成更多的1个Lacs字符串吗,

$arr = [];
$matchStr = [];
for($i=1;$i<=10000;$i++){
    $saltString = "ap_";
    $dynamicStr = substr(md5($saltString.$i), 26, 32);
    do{
       $arr[$i] = $dynamicStr;
    }while(!in_array($dynamicStr,$arr));
}

我可以通过各种方式生成字符串,但没有获得唯一的字符串,并用列的唯一索引存储到mysql表中。

我知道字符串生成的可能性是:

$str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

随机字符串的可能性:字符串长度:10

a-z=26

A-Z=26

0-9=10

(26+26+10)^10=8.3929937 x 10^17当时的可能性。

这有任何在时间上生成字符串的解决方案吗?在laravel尝试下面的代码

function getrandomstr() {
    $length = 6;
    $characters = "0123456789abcdefghijklmnopqrstuvwxyz";
    $string = "";
    for ($p = 0; $p < $length; $p++) {
       @$string .= $characters[mt_rand(0, strlen($characters))];
    }
    return $string;
}
ini_set('max_execution_time', 0);
$arr = [];
$matchStr = [];
$query = [];
for($i=1;$i<=100000;$i++){
   $str = getrandomstr();
   do{
      $query[] = [
          "hashcode" => $str
     ];
   }while('App'Model::where('hashcode',$str)->count() == 0);
}
foreach(array_chunk($query,5000) as $a){
    'App'Model::insert($a);
}
function getrandomstr() {
    $length = 6;
    $characters = "0123456789abcdefghijklmnopqrstuvwxyz";
    $string = "";
    for ($p = 0; $p < $length; $p++) {
        @$string .= $characters[mt_rand(0, strlen($characters))];
    }
    return $string;
}

如果您希望数据库中的每一行都有一个唯一的标识符,请使用一个简单的自动递增整数。如果您不想要一个整数,请使用MySQL中的UUID()函数,它将为您提供一个实际上是唯一的复杂字符串。

如果你想在严格的约束(6个字符的字母数字)内生成一个保证唯一的随机字符串,你需要在插入之前/插入时将其与数据库中的所有现有密钥进行比较。仅仅使用随机字符串生成器最终会生成一个重复字符串,因为结果集有限,频率取决于你的约束。

我建议您看看Hashid。这是一个简单的laravel包(嗯http://hashids.org/)。

添加包后,转到配置并将salt和其他内容更改为该

'main' => [
    'salt' => 'your-salt-string',
    'length' => '6',
    'alphabet' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
],

简单地使用如下:

Hashids::encode(123456);