PHP에서 6자리 비반복 문자열을 생성하는 방법: 1. "substr(md5(microtime(true)), 0, 6);"을 통해 처음 6자리를 가로챕니다. 2. 데이터베이스 bigint를 사용하여 자동으로 -필드를 증가시키고 16진수 형식으로 길이를 줄이세요.
이 기사의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터
PHP는 6자리 비반복 문자열을 어떻게 생성합니까?
PHP는 6자리 비반복 문자열을 생성합니까? -반복 문자열(UUID와 유사)
고려해야 할 사항:
1. 중복이 없습니다.
2. 보안.
【민감한 데이터를 주문 생성 규칙(예: 사용자 UID, 주문 자동 증가 ORDER_ID 등)으로 사용하는 것은 웹사이트의 일부 민감한 정보를 노출시킬 수 있다고 생각하여 권장하지 않습니다】
3. 스케일 랜덤 코드는 사용할 수 없습니다.
why?
우선 "프로그래밍 언어에서 무작위성이 정말 무작위일 수 있나요?"라고 묻고, 적어도 PHP는 할 수 없기 때문에 첫 번째 "반복 없음"으로 이어질 수도 있다는 점을 자신있게 말씀드릴 수 있습니다. " 원칙
주문량이 1000만회에 도달하면 주문 코드를 생성할 때마다 1000만개의 과거 데이터를 비교해야 합니다. 일반적으로 500만회에 도달하면 데이터베이스 최적화에 시간을 투자해야 합니다( 간단한 처리: 파티셔닝 사용, 인덱스 생성, 그러나 실제 요구 사항이 높고 기본 데이터베이스에서 작동해야 할 수도 있습니다. 물론 실시간을 위한 다른 최적화 방법도 있습니다. 데이터베이스 읽기 및 쓰기(여기에서는 소개하지 않음).
4. 동시성을 방지합니다.
5. 제어 자릿수.
왜?
조회 및 검색이 편리함
자릿수는 10~20까지 조절 가능합니다. 물론 인터넷에서는 입력이 너무 길면 편하기 때문에 10~15까지 입니다. , 좋은 사용자 경험을 제공하세요(복사 순서 추가) 버튼)
6. 비즈니스에 의미를 갖도록 노력하세요(필수는 아니며 회사의 비즈니스에 따라 다름)
[비즈니스가 상대적으로 크거나 규모가 클 경우 -향후 규모 확장에 따라 회사의 사업이 조정됨에 따라 발주 의미를 고려하는 것이 좋습니다. 가장 간단한 예를 들어보겠습니다. "화장품을 판매하는 쇼핑몰에서는 주문 소스(PC/모바일)를 기반으로 보고서를 생성해야 합니다. 필요할 수 있습니다."]
7. Solution
// 类似生成 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에서 반복되지 않는 6자리 문자열을 생성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!