php生成订单号函数
收藏php生成订单号函数,方便日后使用。订单号生成很多种方式和方法,有按标志性规则的,有按业务划分的,有按订统一单生成器的,等等等等。但在众多方式中,离不开:安全性,唯一性。生成个:简短,支持高并发,安全唯一的,又包含业务规则的订单号,实在不容易。
一、摘录自:ShopNC 生成订单编号
/**
* ShopNC 生成订单编号
* @return string
*/
function snOrder() {
$recharge_sn = date('Ymd').substr( implode(NULL,array_map('ord',str_split(substr(uniqid(),7,13),1))) , -8 , 8);
return $recharge_sn;
}样例:
string '2018011149985556' (length=16)
string '2018011197489748' (length=16)
解释:
//获取一个带前缀、基于当前时间微秒数的唯一ID。
var_dump(uniqid());
//string '5a5777a2f2eb8' (length=13)
//获取变化频繁的后6位
var_dump(substr(uniqid(),7,13));
//string '2f2eb8' (length=6)
//将字符串转换为数组,每段长度为1
var_dump(str_split(substr(uniqid(),7,13),1));
/*array (size=6)
0 => string '2' (length=1)
1 => string 'f' (length=1)
2 => string '2' (length=1)
3 => string 'e' (length=1)
4 => string 'b' (length=1)
5 => string '8' (length=1)*/
//使用array_map对数组每个值,都掉用ord()函数,返回相应字符的ASCII码值
var_dump(array_map('ord',str_split(substr(uniqid(),7,13),1)));
/*array (size=6)
0 => int 50
1 => int 102
2 => int 51
3 => int 50
4 => int 97
5 => int 48*/
//传入null将数组数字在拼接成为一个数字字符串
var_dump(implode(NULL,array_map('ord',str_split(substr(uniqid(),7,13),1))));
//string '5010251509748' (length=13)
//由于长度很难统一,从倒数第八位开始截取8位数
var_dump(substr(implode(NULL,array_map('ord',str_split(substr(uniqid(),7,13),1))),-8,8));
//string '51509748' (length=8)二、摘录自:ECSHOP 得到新订单号
/**
* ECSHOP 得到新订单号
* @return string
*/
function get_order_sn() {
//选择一个随机的方案
mt_srand((double) microtime() * 1000000);
return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
}样例:
string '2018011181845' (length=13)
string '2018011120993' (length=13)
解释:
//mt_srand() 播种 Mersenne Twister 随机数生成器 //自 PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 函数给随机数发生器播种,现已自动完成 mt_srand((double) microtime() * 1000000); //生成1-99999的随机数 var_dump(mt_rand(1, 99999)); //string '5097' (length=4) //不足5位的随机数,就在前面补0。STR_PAD_LEFT在左端填充 var_dump(str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT)); //string '05097' (length=5)
如果日后开发过程中发现新的,再摘录接着补充进去。
原创文章,转载请注明出处:https://www.weizhixi.com/article/57.html
