我使用php随机函数生成随机数,但我希望生成的数字应该是唯一的,不应再重复。
----------
php code
$number = rand(100,100000); //a six digit random number between 100 to 100000
echo $number;
----------
但我在我的代码中为用户多次使用此功能,因此在非常罕见的情况下应该有可能再次生成相同的数字。我怎么能避免这种情况。
答案 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)
<?php
$number = random_int(100, 100000);
echo $number;
答案 5 :(得分:0)
如果要在DB中存储用户,则应将列[ID]创建为具有自动增量的主键,这将是最佳解决方案。
在其他情况下,我建议您通过读取最后一个ID并向其添加1来简单地以N到M的升序存储所有用户ID,因为我看不到随机顺序的实际增益只会增加代码的复杂性。
答案 6 :(得分:0)
此代码必须有效
关于代码的一些说明:
<?php
$unique = uniqid("",true);
preg_match_all("!\d+!", $unique ,$matches);
print_r($matches);
$numbers = "";
foreach($matches[0] as $key => $num){
$numbers .= $num;
}
echo $numbers;