千家信息网

php如何生成6位不重复的字符串

发表于:2024-12-03 作者:千家信息网编辑
千家信息网最后更新 2024年12月03日,本篇内容介绍了"php如何生成6位不重复的字符串"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php
千家信息网最后更新 2024年12月03日php如何生成6位不重复的字符串

本篇内容介绍了"php如何生成6位不重复的字符串"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

php生成6位不重复的字符串的方法:1、通过"substr(md5(microtime(true)), 0, 6);"截取前6位;2、使用数据库bigint自增字段,转成62进制缩短长度即可。

本文操作环境:windows7系统、PHP7.1版、DELL G3电脑

php怎么生成6位不重复的字符串?

PHP生成6位的不重复的字符串(类似 UUID)

我们要考虑到:

1、不重复。

2、安全性。

【 不建议使用啥敏感的数据作为订单生成规则(例如:用户UID,订单自增ORDER_ID等),以为会暴露网站一些敏感信息】

3、不能使用大规模随机码。

why?

首先问你"编程语言中的随机能做到真随机吗?",我可以不自信的告诉你至少PHP做不到,所以可能导致第一个"不重复"原则发生

如果你的订单数量到达了1000w次,你每次生成订单编码时就得对比1000w条历史数据,一般在500w的时候,你得花时间在数据库优化上(简单处理:采用分区,建立索引,然而实际性要求高,可能需要在主数据库下操作,可想你有多痛,当然对于数据库实时读写还有其他的优化办法,在此不作介绍)。

4、防止并发。

5、控制位数。

why?

  • 便于查询检索

  • 位数控制到 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);

"php如何生成6位不重复的字符串"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

数据 生成 数据库 流水 流水号 订单 计数器 缓存 字符 字符串 业务 时间 加密 位数 公司 内容 办法 大规模 字段 实际 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳市简能网络技术有限 网络技术第四大题技巧 mysql 数据库 大小 计算机网络安全威胁的因素 大数据下检察机关网络安全 杭州通信网络技术服务价格 政务外网网络安全管理办法 威海网络安全展馆 虹口区网络软件开发定制价格 海南潮流软件开发服务参考价格 计算机三级数据库需要会什么 哪个数据库有美股市盈率 软件开发代理商加盟 现有餐厅消费关系数据库如下 上海现代软件开发批发 怪物数据库代码含义 联想ts250服务器安装显卡 软件开发项目验收资料标准 上海亿帐通互联网科技 server数据库简介 新工科下计算机网络技术专业 共话网络安全未来 scada服务器防护 数据库技术三级好考吗 rust找不到以前的服务器 四川浪潮服务器维修哪家好 星河战神为什么服务器异常 腾讯软件开发者 谷歌浏览器服务器通信时出现问题 三明学院网络技术与信息处理
0