Php 如何生成6位唯一数字?
如何生成6位唯一数字?我有适当的验证机制来检查重复条目Php 如何生成6位唯一数字?,php,random,Php,Random,如何生成6位唯一数字?我有适当的验证机制来检查重复条目 $six_digit_random_number = random_int(100000, 999999); 当然,100000和999999之间的所有数字都是六位数。如果您希望它从000001开始,然后转到999999: $num_str = sprintf("%06d", mt_rand(1, 999999)); 请注意,它存储为字符串。另一个: str_pad(mt_rand(0, 999999), 6, '0', STR_PAD
$six_digit_random_number = random_int(100000, 999999);
当然,100000和999999之间的所有数字都是六位数。如果您希望它从
000001
开始,然后转到999999
:
$num_str = sprintf("%06d", mt_rand(1, 999999));
请注意,它存储为字符串。另一个:
str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT);
substr(number_format(time() * rand(),0,'',''),0,6);
无论如何,为了唯一性,您必须检查您的号码是否已被使用
您告诉检查重复的,但要小心,因为当使用大多数数字时,获取新数字的“尝试次数”(以及所花费的时间)会增加,可能会导致很长的延迟和CPU资源的浪费
我建议,如果可能的话,跟踪数组中的可用ID,然后在可用ID中随机选择一个ID,方法如下(如果内存中保留了ID列表):
即使ID列表存储在数据库中,您也可以执行类似操作。我将使用一种算法,暴力可以如下所示: 首次通过循环: 生成一个介于100000到999999之间的随机数,并调用该x1 第二次通过循环 生成100000和x1之间的随机数调用此xt2,然后生成x1和999999之间的随机数调用此xt3,然后随机选择x2或x3,调用此x2 第n次通过循环 生成100000和x1、x1和x2以及x2到999999之间的随机数,依此类推 注意端点,也要注意x1这是另一个:
str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT);
substr(number_format(time() * rand(),0,'',''),0,6);
我希望这会很好。我在我的网站上使用相同的技术。这将生成随机的6位数
您可以生成随机数$characters='123456789';
$characters = '123456789';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < 6; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
$pin=$randomString;
$charactersLength=strlen($characters);
$randomString='';
对于($i=0;$i<6;$i++){
$randomString.=$characters[rand(0,$charactersLength-1)];
}
$pin=$randomString;
在PHP7.0+中,我建议随机整数($min,$max)
超过mt\u rand()
从php.net:
谨慎
此函数不生成加密安全值,不应用于加密目的。如果需要加密的安全值,请考虑使用RealthyIn()、RealthyByTeSe()、或OpenSSLIVRAPIONPIDOOYBYTESE()来代替。
所以这主要取决于上下文。我还要补充一点,从PHP7.1.0开始,rand()
现在是mt\u rand()
的别名
干杯您可以使用$uniq=round(microtime(true))强> 它根据时间生成10位数字
这是永远不会被复制的尝试使用uniqid和hexdec
echo hexdec(uniqid());
在此之前给出的答案中,有一个是最合适的
random_int(100000, 999999)
请注意,这里我们使用的是random\u int
,它是在PHP7中引入的,并使用加密随机生成器,如果您希望随机代码难以猜测,这一点很重要time()
,microtime()
,uniqid()
,rand()
,mt\u rand()
,stru shuffle()
,array\u rand()
,以及shuffle(),如果随机字符串将用作密码、承载凭证、nonce、会话标识符、“验证码”或“确认码”或另一个秘密值,则更具可预测性且不合适
上面的代码生成一个由6位十进制数字组成的字符串。如果您想使用更大的字符集(例如所有大写字母、所有小写字母和10位数字),这是一个更复杂的过程,但您必须使用random\u int
或random\u bytes
而不是rand()
、mt\u rand()
、str\u shuffle()
等。,如果字符串将用作密码、“确认码”或其他机密值。请参见,另请参见:
我还列出了生成唯一标识符的时间,尤其是随机标识符的时间。有一些很好的答案,但许多使用的函数被标记为不加密安全。如果您想要一个加密安全的随机6位数字,您可以使用如下内容:
$key = random_int(0, 9999999);
$key = str_pad($key, 6, 0, STR_PAD_LEFT);
return $key;
这还将包括000182等数字以及其他可能从其他示例中排除的数字。如果是这样,为什么不使用序列号呢?或者使用时间戳?可能是重复的,你知道这个方法生成了多少个随机数吗?如果得到相同的随机数呢?@salemahmed。不,真的,数字很可能重复,但仍然是随机的。这很好。其他解决方案(Tim Cooper和Frosty Z)更好,因为它们也生成1到100000之间的数字。@SamuelLindblom虽然这是真的,但这些数字是用左边的零生成的,这可能会导致奇怪和副作用,包括被误解为八进制数的可能性。通过保留100000作为底部数字,您可以确保它始终被视为预期数字。这些类型的6位代码通常用于安全目的。因此,值得注意的是,在MTYRAND DOCS中,它建议不使用它来达到这些目的,“警告该函数不生成加密的安全值,不应该用于加密目的。如果需要加密的安全值,请考虑使用RealthyIn()、RealthyByTeSe)或OpenSSLRead伪随机字节()。相反,“这是随机的(mt_rand
)还是顺序的(从*开始到*)?你的答案和@Charles在2011年3月28日提供的答案有什么区别?没有区别:)@TrixAs这个问题已经问了6年了,不知道这会给已经发布的答案增加多少。为什么?你不应该
$key = random_int(0, 9999999);
$key = str_pad($key, 6, 0, STR_PAD_LEFT);
return $key;