我想按照以下12种数字格式生成唯一标识符:
YYYYMMDDXXXX
示例:
201403052318
其中:
YYYYMMDD是当前日期值,其他XXXX是随机生成的值。
$today = date("Ymd");
$rand = sprintf("%04d", rand(0,9999));
$unique = $today . $rand;
每日所需的唯一卷大约为100.我应该使用哪些方法来防止rand值中可能的重复或使所有id最大唯一?也许可以使用当前时间函数来压缩最后4个字符中的这些数字?
EDITED: 连接到MySQL数据库的唯一值作为表的主索引。它是与数据库中任何存储信息无关的初始值。
答案 0 :(得分:12)
你不能依赖rand()
,你有可能会产生重复(rand(0,9999)
很少生成重复,但在某些时候会发生重复)。
因此,不要选择rand()
,而只需创建一个增量值(例如从...开始)并附加到生成的日期。
下次当你重新生成一个新的id时,抓住那个增量值(比如你把它存储在某处......必须是1对吗?)状态,增加它并将它附加到你的新日期。
您可以使用uniqid
与sha-1
和time
相结合,并为前4个字符对其进行substr()
。
<?php
$today = date("Ymd");
$rand = strtoupper(substr(uniqid(sha1(time())),0,4));
echo $unique = $today . $rand;
<强> OUTPUT :
强>
201403094B3F
答案 1 :(得分:7)
我需要做类似的事情,这个解决方案可以保留时间并保持ID唯一性,我最终得到了一个使用PHP
function time()
这样的解决方案
$reference_number = 'BFF-' . time()
;您可以将BFF
更改为对您的业务逻辑更有意义的内容。
我的唯一引用ID看起来像BFF-1393327176
,数字可以从Unix转换为实时,这将为您提供Tue, 25 Feb 2014 11:19:36
我希望这会有所帮助
答案 2 :(得分:0)
如果生成一次唯一值,您只需要对rand值进行条件选择,并将值存储在一个数组中,该数组将成为条件 - 使用inarray - :
$amount = 100; // the amount of ids
$previousValues = array();
for ($i = 0; $i < $amount; $i++){
$rand = rand(0,9999);
while (in_array($rand, $previousValues)){
$rand = rand(0, 9999);
}
$previousValues[] = $rand;
$today = date("Ymd");
$unique = $today.$rand;
echo $unique."\n";
}
结帐 this demo 。
答案 3 :(得分:0)
创建唯一“唯一订单号”的可能解决方案如下,我假设您有订单表和字段order_number,那么代码是:
$orderNumber = DB::table('orders')->max('order_number') + random_int(10, 100);
如果第一个订单号被插入为“100000000000”,该方法会给你这个数字:
100000000025
100000000056
100000000089
100000000123
100000000199
100000000232
100000000249
使用这种方法,不可能出现非唯一数字,但缺点是每个数字都比前一个数字大(不是 100% 随机),但这种方法在大多数情况下是可以接受的。