【问题标题】:How to generate unique alpha-numeric string in php at time(with predefine length [length = 6])如何在 php 中生成唯一的字母数字字符串(预定义长度 [length = 6])
【发布时间】:2016-03-28 07:54:25
【问题描述】:

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

我在 stackoverflow 上收到问题和答案。

shorturl on stackoverflow

Random string generate in php but not unique string

Random, unique string generate in php but didn't unique at time with 6 length of string

我可以一次生成更多 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);
}

【问题讨论】:

标签: php string laravel laravel-5


【解决方案1】:
function getrandomstr() {
    $length = 6;
    $characters = "0123456789abcdefghijklmnopqrstuvwxyz";
    $string = "";

    for ($p = 0; $p < $length; $p++) {
        @$string .= $characters[mt_rand(0, strlen($characters))];
    }

    return $string;
}

【讨论】:

  • @DhavalTasol:它确实会在您定义的约束(6 个字符,字母数字)内生成一个随机字符串。它不能返回 MySQL 错误,因为它不使用 MySQL - 该错误来自代码中的其他地方。
  • 您的代码不正确!由于错误使用mt_rand,它可能会返回较短的字符串。 rand 函数可以返回从 0 到最大值(在这种情况下为 strlen($characters))的任何整数,包括但 strlen($characters) 大于 $characters 字符串的最大索引(因为索引从 0 开始)。正确的行是:$string .= $characters[mt_rand(0, strlen($characters) - 1)];
【解决方案2】:

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

如果您希望能够在严格约束(6 个字符的字母数字)内生成保证唯一的随机字符串,则需要在插入之前/同时将其与数据库中的所有现有键进行比较.仅使用随机字符串生成器最终会生成一个副本,因为结果的集合是有限的,频率取决于您的约束。

【讨论】:

    【解决方案3】:

    我建议你看看Hashids。这是一个简单的 laravel 包(嗯,是 http://hashids.org/ 的包装器)。

    添加软件包后,转到配置并将 salt 和其余部分更改为此

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

    然后像这样简单地使用:

    Hashids::encode(123456);
    

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 2011-08-18
      • 1970-01-01
      相关资源
      最近更新 更多