【发布时间】:2011-07-24 19:23:48
【问题描述】:
如何生成 6 位唯一编号?我有验证机制来检查重复条目。
【问题讨论】:
-
如果是这样,为什么不使用序号呢?还是使用时间戳?
如何生成 6 位唯一编号?我有验证机制来检查重复条目。
【问题讨论】:
$six_digit_random_number = random_int(100000, 999999);
当然,100,000 到 999,999 之间的所有数字都是六位数。
【讨论】:
如果您希望它从000001 开始并转到999999:
$num_str = sprintf("%06d", mt_rand(1, 999999));
请注意,它是以字符串形式存储的。
【讨论】:
mt_rand) 还是顺序的(从 * 开始到 *)?
另一个:
str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT);
无论如何,为了唯一性,您必须检查您的号码是否未被使用。
您告诉您检查重复项,但要小心,因为当大多数号码将被使用时,获取新号码的“尝试”次数(以及因此花费的时间)会增加,可能会导致很长的延迟和浪费 CPU 资源。
如果可能的话,我建议跟踪数组中的可用 ID,然后通过执行类似操作(如果 ID 列表保存在内存中)随机选择一个 ID在可用 ID 中 ):
$arrayOfAvailableIDs = array_map(function($nb) {
return str_pad($nb, 6, '0', STR_PAD_LEFT);
}, range(0, 999999));
$nbAvailableIDs = count($arrayOfAvailableIDs);
// pick a random ID
$newID = array_splice($arrayOfAvailableIDs, mt_rand(0, $nbAvailableIDs-1), 1);
$nbAvailableIDs--;
即使 ID 列表存储在数据库中,您也可以执行类似操作。
【讨论】:
这是另一个:
substr(number_format(time() * rand(),0,'',''),0,6);
【讨论】:
<?php
$file = 'count.txt';
//get the number from the file
$uniq = file_get_contents($file);
//add +1
$id = $uniq + 1 ;
// add that new value to text file again for next use
file_put_contents($file, $id);
// your unique id ready
echo $id;
?>
我希望这会正常工作。我在我的网站中使用了相同的技术。
【讨论】:
在 PHP 7.0+ 中,我建议使用random_int($min, $max) mt_rand()。
$randomSixDigitInt = \random_int(100000, 999999);
来自 php.net:
注意 此函数不会生成加密安全值,并且不应用于加密目的。如果您需要加密安全值,请考虑改用 random_int()、random_bytes() 或 openssl_random_pseudo_bytes()。
所以这主要取决于上下文。我还要补充一点,从 PHP 7.1.0 开始,rand() 现在是 mt_rand() 的别名。
干杯
【讨论】:
有一些很好的答案,但许多使用标记为非加密安全的功能。如果您想要一个加密安全的随机 6 位数字,您可以使用以下内容:
$key = random_int(0, 999999);
$key = str_pad($key, 6, 0, STR_PAD_LEFT);
return $key;
这也将包括 000182 等数字以及其他本应从其他示例中排除的数字。
您还可以使用循环使每个数字随机化,并根据您的需要生成包含尽可能多的数字的随机数:
function generateKey($keyLength) {
// Set a blank variable to store the key in
$key = "";
for ($x = 1; $x <= $keyLength; $x++) {
// Set each digit
$key .= random_int(0, 9);
}
return $key;
}
作为参考,random_int — 生成加密安全的伪随机整数,适用于对无偏结果至关重要的情况,例如在扑克游戏中洗牌时。" - php.net/random_int
【讨论】:
$characters = '123456789';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < 6; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
$pin=$randomString;
【讨论】:
这将生成随机的 6 位数字
<?php
mt_rand(100000,999999);
?>
【讨论】:
我会使用一个算法,蛮力可以如下:
第一次循环: 生成一个介于 100,000 到 999,999 之间的随机数并将其称为 x1
第二次循环 生成一个100,000到x1之间的随机数调用这个xt2,然后生成一个x1到999,999之间的一个随机数调用这个xt3,然后随机选择x2或x3,调用这个x2
第 N 次循环 生成 100,000 到 x1、x1 和 x2、x2 到 999,999 之间的随机数……
注意端点,也要注意 x1
【讨论】:
<?php echo rand(100000,999999); ?>
你可以生成随机数
【讨论】:
你可以使用 $uniq = round(microtime(true));
它会根据时间生成 10 位数字 永远不会被复制
【讨论】:
使用 uniqid 和 hexdec 试试这个,
echo hexdec(uniqid());
【讨论】:
在此之前这里给出的答案中,the one by "Yes Barry" 是最合适的答案。
random_int(100000, 999999)
请注意,这里我们使用random_int,它是在 PHP 7 中引入并使用加密随机生成器,如果您希望随机代码难以猜测,这一点很重要。 random_bytes 也在 PHP 7 中引入,同样使用加密随机生成器。
许多其他用于随机值生成的解决方案,包括涉及time()、microtime()、uniqid()、rand()、mt_rand()、str_shuffle()、array_rand() 和 shuffle() 的解决方案还有很多如果随机字符串用作密码、承载凭证、随机数、会话标识符、“验证码”或“确认码”或其他秘密值,则可预测且不适合。
上面的代码生成一个 6 位十进制数字的字符串。如果你想使用更大的字符集(比如全大写字母、全小写字母和10位数字),这是一个更复杂的过程,但你必须使用random_int或random_bytes而不是比rand()、mt_rand()、str_shuffle() 等,如果字符串将用作密码、“确认码”或其他秘密值。请参阅answer to a related question,另请参阅:generating a random code in php?
在生成唯一标识符时,我还会列出other things to keep in mind,尤其是随机标识符。
【讨论】: