Php 伪随机串
我需要从这些字母生成代码Php 伪随机串,php,string,Php,String,我需要从这些字母生成代码 $a = array( 'B','C','D','F','G','H','J','K','L','M','N','O', 'P','Q','R','S','T','V','W','X','Y','Z','1','2', '3','4','5','6','7','8','9','0' ); 但有两个条件:每个代码必须是唯一的,并且包含10个字母。我不想随机,因为这是无效的。相反,我希望每个字母都可以,例如: bbbbbbbbbbbb bbbbbb
$a = array(
'B','C','D','F','G','H','J','K','L','M','N','O',
'P','Q','R','S','T','V','W','X','Y','Z','1','2',
'3','4','5','6','7','8','9','0'
);
但有两个条件:每个代码必须是唯一的,并且包含10个字母。我不想随机,因为这是无效的。相反,我希望每个字母都可以,例如:
等等。。有什么想法吗?最好只使用uniqid,尤其是考虑到您所说的将生成160万个代码。如果您关心这个案例,只需使用strtoupper()
生成所有这些并插入它们需要相当长的时间
我认为你真正想要的是一个序列号列表(因此根本不是随机的),带有一个非常非传统的基本系统。所以bbbbbbb
是0
,而bbbbbbb c
是1
。这并不难做到,但显然你必须自己编写代码。类似的方法可能会奏效:
<?php
$length = 3;
$letters = str_split("ABC"); // define your dictionary here
$index = array_fill(0, $length, 0);
$key = $length - 1;
while(true) {
$code = "";
for($i=0;$i<$length;$i++) {
$code .= $letters[$index[$i]];
}
echo $code ."<br/>"; // output code
$index[$key]++;
while(!isset($letters[$index[$key]])) {
$index[$key] = 0;
$key--;
if($key < 0) {
break 2;
}
$index[$key]++;
}
$key = $length - 1;
}
function generate($num) {
$num = base_convert($num, 10, 32); // convert the number to base 32
$num = str_pad($num, 10, "0", STR_PAD_LEFT); // pad it with zeros to the left
$num = str_replace(array(
'0','1','2','3','4','5','6','7','8','9','a','b',
'c','d','e','f','g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v'
), array(
'B','C','D','F','G','H','J','K','L','M','N','O',
'P','Q','R','S','T','V','W','X','Y','Z','1','2',
'3','4','5','6','7','8','9','0'
), $num); // replace the normal characters with your custom array
echo $num, "\n";
}
for ($i = 0; $i < 10; $i++) generate($i);
为什么不直接使用像uniqid
?我可以保证这将比自己构建字符串更有效。我需要生成1,6mln代码并将它们保存到数据库中。如何使用uniqid?@PeterSzymkowski,是的,但它清楚地显示了它必须如何工作。lonesomeday的问题是,这个代码显然有效,但很难理解。您认为您可以使用描述性变量名,而不是$s
、$v
等吗?聪明的解决方案,但相当简单slow@PeterSzymkowski嗯,是的。但让我们面对现实:如果速度是目标,那么解决方案就是使用简单的旧数字。+1对于这一点,绝对是完成任务最简单的答案。要考虑的一件事(这适用于任何一种方法)是,你需要立即将它存储在数据库中,因为用生成的值填充数组会消耗疯狂的内存量。难以置信的是,PeterSzymkowski的解决方案在我的DEV机器上的速度是6倍以上。好的解决方案,但是替换:$index=ARARYY();对于($i=0;$i)来说,它是一个代码板,具有OP要求的格式和字典。这确实比我的解决方案快了很多(5到10倍),所以是一个大+1。
<?php
$a = array(
'B','C','D','F','G','H','J','K','L','M','N','O',
'P','Q','R','S','T','V','W','X','Y','Z','1','2',
'3','4','5','6','7','8','9','0'
);
function key_increment (&$symbols, $position = null)
{
global $a;
if ($position === null) $position = count($symbols) - 1;
if ($position == -1) return;
$index = $symbols[$position];
$index ++;
if (!isset($a[$index])) {
$v = 0;
key_increment ($symbols, $position-1);
}
$symbols[$position] = $value;
}
function generate($length, $total)
{
global $a;
$symbols = array_fill(0, $length, 0);
for ($i = 0; $i < $total; $i ++) {
$code = '';
foreach ($symbols as $index) {
$code .= $a[$index];
}
echo $code;
echo '<br />';
key_increment($symbols);
}
}
generate(3, 100);
function generate($num) {
$num = base_convert($num, 10, 32); // convert the number to base 32
$num = str_pad($num, 10, "0", STR_PAD_LEFT); // pad it with zeros to the left
$num = str_replace(array(
'0','1','2','3','4','5','6','7','8','9','a','b',
'c','d','e','f','g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v'
), array(
'B','C','D','F','G','H','J','K','L','M','N','O',
'P','Q','R','S','T','V','W','X','Y','Z','1','2',
'3','4','5','6','7','8','9','0'
), $num); // replace the normal characters with your custom array
echo $num, "\n";
}
for ($i = 0; $i < 10; $i++) generate($i);
BBBBBBBBBB
BBBBBBBBBC
BBBBBBBBBD
BBBBBBBBBF
BBBBBBBBBG
BBBBBBBBBH
BBBBBBBBBJ
BBBBBBBBBK
BBBBBBBBBL
BBBBBBBBBM