我正试图在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);