我正在尝试在php中生成6个字符长的字母数字字符串。
我在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);
}
答案 0 :(得分:0)
function getrandomstr() {
$length = 6;
$characters = "0123456789abcdefghijklmnopqrstuvwxyz";
$string = "";
for ($p = 0; $p < $length; $p++) {
@$string .= $characters[mt_rand(0, strlen($characters))];
}
return $string;
}
答案 1 :(得分:0)
如果要为数据库中的每一行指定唯一标识符,请使用简单的自动递增整数。如果您不想要整数,请使用MySQL中的UUID()
函数,这将为您提供一个几乎唯一的复杂字符串。
如果您希望能够在严格约束(6个字符的字母数字)内生成一个保证唯一的随机字符串,则需要在插入之前/之后将其与数据库中的所有现有密钥进行比较。只使用随机字符串生成器最终会生成一个副本,因为有一组有限的结果,通常取决于你的约束。
答案 2 :(得分:0)
我建议你看看Hashids。它是一个简单的laravel包(好吧,http://hashids.org/的包装器)。
添加软件包后,转到config并更改salt,其余的更改为
sed "s|,|\n|g" $1 | head -n -1 > $2
简单地使用这样:
'main' => [
'salt' => 'your-salt-string',
'length' => '6',
'alphabet' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
],