PHP生成6位的不重复的字符串(类似 UUID)
PHP怎么生成6位的不重复的字符串
我们要考虑到:
1、不重复。
2、安全性。
【 不建议使用啥敏感的数据作为订单生成规则(例如:用户UID,订单自增ORDER_ID等),以为会暴露网站一些敏感信息】
3、不能使用大规模随机码。
why?
首先问你"编程语言中的随机能做到真随机吗?",我可以不自信的告诉你至少PHP做不到,所以可能导致第一个"不重复"原则发生
如果你的订单数量到达了1000w次,你每次生成订单编码时就得对比1000w条历史数据,一般在500w的时候,你得花时间在数据库优化上(简单处理:采用分区,建立索引,然而实际性要求高,可能需要在主数据库下操作,可想你有多痛,当然对于数据库实时读写还有其他的优化办法,在此不作介绍)。
4、防止并发。
5、控制位数。
why?
1. 便于查询检索
2 位数控制到 10-20位即可,当然网上将的是10~15缘由是利于输入,对于输入太长做好用户体验就好(新增复制订单按钮)
6、尽量具有业务意义(不是强制的,根据公司业务来)
【当你业务比较庞大时候,或者后期有大规模的扩充时,建议考虑下订单的生成意义,根据公司的业务做调整。举个最简单的例子:"一个卖化妆品的商城,你需要根据订单来源来(pc/移动)来生成报表,这时候可能需要"】
7.解决办法
// 类似生成 UUID ,不依赖外部流水号,完全靠时间戳和随机数生成订单号无法避免冲突,
// 所以必须引入外部的流水号生成机制。或使用数据库,或使用APC之类的缓存。
// 用APC之类的缓存存在一个问题,就是无法持久保持数据,服务器重启或者PHP宿主进程重启都会清空流水号计数器,
// 所以可以采取缓存+数据库结合的模式——如果缓存中有流水号计数器数据则读取并累加计数,如果缓存中没有流水号计数器从数据库中还原计数器。
// 计数器可以每隔一段时间重置一次。既然引入了自增流水号计数器,又会导致文章开头的“德国坦克问题”,
// 所以需要用skip32算法把流水号加密
// (https://github.com/nlenepveu/Skip32)。
// 订单号 = 日期前缀 + 加密流水号
// Skip32 算法加密密钥
const ENCRYPTED_KEY = 'xxxxxxxxxxxx';
// 使用 Wincache 作为流水号计数器缓存
function getOrderSerialNumber() {
$timestamp = time();
$datePrefix = date('ymd', $timestamp);
// 如果流水号计数器数据不在缓存中,则尝试从数据库中恢复
if (false === ($value = wincache_ucache_inc($datePrefix))) {
wincache_lock($datePrefix);
// 从数据库中获取今日的订单数
$counter = getNumberOfOrdersTodayFromDatabase($timestamp);
$value = $counter + 1;
if (!wincache_ucache_add($datePrefix, $value, 60*60*24)) {
$value = wincache_ucache_inc($datePrefix);
}
wincache_unlock($datePrefix);
}
return $datePrefix.str_pad(Skip32::encrypt($datePrefix.ENCRYPTED_KEY, $value), 10, '0', STR_PAD_LEFT);
}
简单方式:
1.当前时间戳md5加密,截取前6位
echo substr(md5(microtime(true)), 0, 6);
2.使用数据库bigint自增字段,转成62进制缩短长度
echo gmp_strval(gmp_init('9876543210', 10), 62);
(资源库 www.zyku.net)
原文链接:https://blog.csdn.net/CB_1213/article/details/106478583
上一篇:PHP 301 重定向跳转
栏 目:PHP教程
下一篇:php中input的onclick,onkeydown、onkeyup、onclick、onchange、oninput、onpropertychange 的用法和区别
本文地址:https://www.zyku.net/php/2240.html
您可能感兴趣的文章
- 01-11耳耳健康-耳耳健康应用软件功能介绍
- 12-30网络工程师题库-网络工程师题库应用软
- 03-03小米手机电话骚扰拦截设置方法
- 12-29洋芋买买-洋芋买买应用软件功能介绍
- 11-02小天才电话手表如何更换表带
- 12-04华为P50Pro门禁卡添加步骤一览
- 01-12快鸟笙鲜-快鸟笙鲜应用软件功能介绍
- 12-31土豆目标打卡-土豆目标打卡应用软件功
- 01-12知识英雄app-知识英雄app应用软件功能
- 03-19红魔6显示电量百分比设置方法
- 01-11硕果题库-硕果题库应用软件功能介绍
- 03-28VtigerCRM修改登陆面板去掉新闻模块
- 07-15帝国CMS多值字段morevaluefield详解
- 02-28iPhone12设置显示号码归属地操作教程
- 04-15小米11青春版关闭锁屏按键声教程
- 03-04wordpress防黑教程之保护文件上传目录
- 01-19斗图工厂-斗图工厂应用软件功能介绍
- 09-27OPPOreno6怎么设置省电模式
- 04-14魅族18pro开发者模式开启教程
- 02-18红米k40游戏增强版录屏功能开启方法
![](https://file.zyku.net/p/d2cc0be0649fe2194061a1910a53a2d7.png)
最近更新
阅读排行
猜你喜欢
- 11-10三星s21怎么投屏
- 01-12财今商学堂-财今商学堂应用软件功能介
- 09-19微信怎样取消核酸检测预约
- 02-21红米k40杜比全景声音效开启教程
- 11-21Sublime Text 3 安装Package Control
- 02-13小米11清除所有数据操作方法
- 02-20小米11pro关闭应用分身教程
- 11-22Office 2010/2013 图标显示不正常的解
- 10-12剪映怎么开启抠图功能
- 09-14华为音乐取消免密支付方法介绍