如何在PHP中生成唯一的随机数?

时间:2018-04-10 03:36:19

标签: php

我使用php随机函数生成随机数,但我希望生成的数字应该是唯一的,不应再重复。

----------
php code
 $number = rand(100,100000); //a six digit random number between 100 to 100000 
echo $number;

----------

但我在我的代码中为用户多次使用此功能,因此在非常罕见的情况下应该有可能再次生成相同的数字。我怎么能避免这种情况。

7 个答案:

答案 0 :(得分:1)

您需要做的就是在php中使用时间戳,因为时间戳永远不会相互交叉,因此它总是会生成唯一的数字。您可以在php中使用time()函数。

time()函数用于将时间戳格式化为人类所需的格式。时间戳是当前时间与格林威治标准时间1970年1月1日00:00:00之间的秒数。它也称为UNIX时间戳。

<?php
$t=time();
echo $t;
?>

此外,您添加rand()函数并将其插入$t前面以使其更加随机,就好像少数用户同时工作,然后时间戳可能会发生冲突。

<?php
$number = rand(100,100000);
$t=time();
$random = $number.''.$t;

echo $random;
?>

以上将减少时间戳碰撞的机会,从而使数字唯一性的概率几乎达到100%。

如果您在数据库中创建列unique,那么php将不会插入数字,因此这个瓶颈将确保您始终获得一个唯一的随机数。

 bill_id not null unique

答案 1 :(得分:0)

有很多方法,例如:

$freq = [];
$number = rand(100,100000);
$times = 10;
while($times-- > 0)
{
   while(in_array($number, $freq))$number = rand(100,100000);
   $freq[] = $number;
   echo $number . "<br>";
}

这将打印10个随机唯一数字。

答案 2 :(得分:0)

如果您将其用于类似用户ID的内容,则可以使用uniqid。此命令根据当前时间(以微秒为单位)获取带前缀的唯一标识符。

以下是如何使用它:

string uniqid ([ string $prefix = "" [, bool $more_entropy = FALSE]] )

如果您在同一时间为主机生成ID,则使用前缀,如果在同一微秒生成id,则可以使用此选项来区分各种主机。

more_entropy增加了获取唯一值的相似性。

用法:

<?php
/* A uniqid, like: 4b3403665fea6 */
printf("uniqid(): %s\r\n", uniqid());

/* We can also prefix the uniqid, this the same as 
 * doing:
 *
 * $uniqid = $prefix . uniqid();
 * $uniqid = uniqid($prefix);
 */
printf("uniqid('php_'): %s\r\n", uniqid('php_'));

/* We can also activate the more_entropy parameter, which is 
 * required on some systems, like Cygwin. This makes uniqid()
 * produce a value like: 4b340550242239.64159797
 */
printf("uniqid('', true): %s\r\n", uniqid('', true));
?>

答案 3 :(得分:0)

我会这样做:

你说你有分支机构。收据ID可能如下所示:

$dateString = date('Ymd'); //Generate a datestring.
$branchNumber = 101; //Get the branch number somehow.
$receiptNumber = 1;  //You will query the last receipt in your database 
//and get the last $receiptNumber for that branch and add 1 to it.;

if($receiptNumber < 9999) {

  $receiptNumber = $receiptNumber + 1;

}else{
 $receiptNumber = 1;
} 

使用收据编号更新收据数据库。

$dateString . '-' . $branchNumber . '-' . $receiptNumber;

这将是:

20180406-101-1 

这将是独一无二的(假设您每天的交易次数少于10,000次。)并且会向您的员工展示易于阅读的信息。

答案 4 :(得分:0)

random_int (PHP 7)

<?php
$number =  random_int(100, 100000);
echo $number;

答案 5 :(得分:0)

如果要在DB中存储用户,则应将列[ID]创建为具有自动增量的主键,这将是最佳解决方案。

在其他情况下,我建议您通过读取最后一个ID并向其添加1来简单地以N到M的升序存储所有用户ID,因为我看不到随机顺序的实际增益只会增加代码的复杂性。

答案 6 :(得分:0)

此代码必须有效

关于代码的一些说明:

  1. 生成唯一ID
  2. 使用正则表达式提取数字形成唯一 ID
  3. 使用循环从正则表达式中收集数字
<?php

$unique = uniqid("",true);
preg_match_all("!\d+!", $unique ,$matches);
print_r($matches);
$numbers = "";
foreach($matches[0] as $key => $num){
   $numbers .= $num; 
}

echo $numbers;