第一种:年月日时分秒+拼接随机数 危险 稍微体量一大这种肯定有重复
$danhao = date('YmdHis') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
第二种:好复杂 直接用随机数代替不香吗
uniqid生成基于毫秒的唯一码 substr截取一部分 str-plit进行转化为数组 array_map转化每个数组元素,implode拼接
$danhao = date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
第三种:ymdhis+随机数+检查码
//生成24位唯一订单号码,
//格式:
//YYYY-MMDD-HHII-SS-NNNN,NNNN-CC,
//YYYY=年份,MM=月份,DD=日期,HH=24格式小时,II=分,SS=秒,
//NNNNNNNN=随机数,CC=检查码
@date_default_timezone_set("PRC");
//订购日期
$order_date = date('Y-m-d');
//订单号码主体(YYYYMMDDHHIISSNNNNNNNN)
$order_id_main = date('YmdHis') . rand(10000000,99999999);
//订单号码主体长度
$order_id_len = strlen($order_id_main);
$order_id_sum = 0;
for($i=0; $i<$order_id_len; $i++){
$order_id_sum += (int)(substr($order_id_main,$i,1));
}
//唯一订单号码(YYYYMMDDHHIISSNNNNNNNNCC)
$order_id = $order_id_main . str_pad((100 - $order_id_sum % 100) % 100,2,'0',STR_PAD_LEFT);
第四种:混拼字母
dechex十进制转化为十六进制 减去年份因为年份太长了!
<?php
$yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J');
$orderSn = $yCode[intval(date('Y')) - 2011] . strtoupper(dechex(date('m'))) . date('d') .
substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99));
?>
第五种:雪花算法
基于Twitter的SnowFlake算法的实现,这个算法的好处很简单可以在每秒产生约400W个不同的16位数字ID(10进制)。
原理很简单
ID由64bit组成
其中 第一个bit空缺
41bit用于存放毫秒级时间戳
10bit用于存放机器id
12bit用于存放自增ID
除了最高位bit标记为不可用以外,其余三组bit占位均可浮动,看具体的业务需求而定。默认情况下41bit的时间戳可以支持该算法使用到2082年,10bit的工作机器id可以支持1023台机器,序列号支持1毫秒产生4095个自增序列id。
资源地址:https://github.com/sschiau/Particle
下面是PHP源码
<?php
abstract class Particle {
const EPOCH = 1479533469598;
const max12bit = 4095;
const max41bit = 1099511627775;
static $machineId = null;
public static function machineId($mId) {
self::$machineId = $mId;
}
public static function generateParticle() {
/*
* Time - 42 bits
*/
$time = floor(microtime(true) * 1000);
/*
* Substract custom epoch from current time
*/
$time -= self::EPOCH;
/*
* Create a base and add time to it
*/
$base = decbin(self::max41bit + $time);
/*
* Configured machine id - 10 bits - up to 1024 machines
*/
$machineid = str_pad(decbin(self::$machineId), 10, "0", STR_PAD_LEFT);
/*
* sequence number - 12 bits - up to 4096 random numbers per machine
*/
$random = str_pad(decbin(mt_rand(0, self::max12bit)), 12, "0", STR_PAD_LEFT);
/*
* Pack
*/
$base = $base.$machineid.$random;
/*
* Return unique time id no
*/
return bindec($base);
}
public static function timeFromParticle($particle) {
/*
* Return time
*/
return bindec(substr(decbin($particle),0,41)) - self::max41bit + self::EPOCH;
}
}
$machineID = 0; // Machine ID (aka Server ID no.)
$res = Particle::generateParticle($machineID);
print_r($res);
第六种:项目中用到的
$time = time();
$orderCode = '60' . time() . rand(11111111, 99999999);