php生成字符串唯一不重复的方法:使用数据库bigint自增字段

优采云 发布时间: 2021-07-04 20:33

  php生成字符串唯一不重复的方法:使用数据库bigint自增字段

  php生成字符串唯一不重复的方法:1、对当前时间戳进行md5加密,截取前6位; 2、使用数据库bigint自增字段,将其转换为62十六进制以缩短长度。

  

  本文运行环境:windows7系统,PHP7.1版本,DELL G3电脑

  PHP 如何生成 6 位唯一字符串?

  PHP 生成 6 位唯一字符串(类似于 UUID)

  我们必须考虑:

  1、 不再重复。 2、Security。

  【 不建议使用啥敏感的数据作为订单生成规则(例如:用户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);

  推荐:《PHP 视频教程》

  以上是php如何生成字符串的唯一非重复细节。更多详情请关注其他相关php中文网站文章!

  

  免责声明:本文原创发布于php中文网,转载请注明出处,感谢您的尊重!如果您有任何问题,请联系我们

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线