PHP生成订单号的五种方法:时间拼接随机数 混拼字母 减年份转十六进制 雪花算法 拼接时间戳与随机数
生活随笔
收集整理的這篇文章主要介紹了
PHP生成订单号的五种方法:时间拼接随机数 混拼字母 减年份转十六进制 雪花算法 拼接时间戳与随机数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第一種:年月日時分秒+拼接隨機數? ?危險 稍微體量一大這種肯定有重復
$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);?
總結
以上是生活随笔為你收集整理的PHP生成订单号的五种方法:时间拼接随机数 混拼字母 减年份转十六进制 雪花算法 拼接时间戳与随机数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百合网相亲成功率(百合网相亲)
- 下一篇: 反思避免只是小聪明:更加稳重 更加踏实