文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php教程>php怎么生成字符串唯一不重复

php怎么生成字符串唯一不重复

时间:2021-07-13  来源:互联网

今天PHP爱好者给大家带来php生成字符串唯一不重复的方法:1、当前时间戳进行md5加密,截取前6位;2、使用数据库bigint自增字段,转成62进制缩短长度。希望对大家有所帮助。

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

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

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

我们要考虑到:

1、不重复。

2、安全性。


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

why?

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

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

4、防止并发。

5、控制位数。

why?
1. 便于查询检索
2 位数控制到 10-20位即可,当然网上将的是10~15缘由是利于输入,对于输入太长做好用户体验就好(新增复制订单按钮)

6、尽量具有业务意义(不是强制的,根据公司业务来)


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怎么生成字符串唯一不重复的详细内容,更多请关注php爱好者其它相关文章!

相关阅读更多 +
最近更新
排行榜 更多 +
元梦之星最新版手游

元梦之星最新版手游

棋牌卡牌 下载
我自为道安卓版

我自为道安卓版

角色扮演 下载
一剑斩仙

一剑斩仙

角色扮演 下载