PHP에서 문자열을 생성하는 유일한 비반복 방법: 1. md5로 현재 타임스탬프를 암호화하고 처음 6자리를 가로챕니다. 2. 데이터베이스 bigint를 사용하여 필드를 자동 증가시키고 62로 변환하여 단축합니다. 길이.
이 기사의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터
PHP는 어떻게 반복되지 않는 6자리 문자열을 생성합니까?
PHP는 6자리의 반복되지 않는 문자열을 생성합니다(UUID와 유사)
고려해야 할 사항:
【 不建议使用啥敏感的数据作为订单生成规则(例如:用户UID,订单自增ORDER_ID等),以为会暴露网站一些敏感信息】
3. 대규모 랜덤코드는 사용이 불가능합니다.
why?
why? 1. 便于查询检索 2 位数控制到 10-20位即可,当然网上将的是10~15缘由是利于输入,对于输入太长做好用户体验就好(新增复制订单按钮)
【当你业务比较庞大时候,或者后期有大规模的扩充时,建议考虑下订单的生成意义,根据公司的业务做调整。举个最简单的例子:"一个卖化妆品的商城,你需要根据订单来源来(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로 암호화되어 있습니다.
echo substr(md5(microtime(true)), 0, 6);
2 데이터베이스 bigint를 사용하여 필드를 자동 증가시키고 16진수로 변환하여 길이를 줄입니다
echo gmp_strval(gmp_init('9876543210', 10), 62);
권장: "PHP 비디오 튜토리얼"
위 내용은 PHP에서 고유하고 반복되지 않는 문자열을 생성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!