>백엔드 개발 >PHP 문제 >PHP에서 반복되지 않는 6자리 문자열을 생성하는 방법

PHP에서 반복되지 않는 6자리 문자열을 생성하는 방법

藏色散人
藏色散人원래의
2021-11-03 10:58:483321검색

PHP에서 6자리 비반복 문자열을 생성하는 방법: 1. "substr(md5(microtime(true)), 0, 6);"을 통해 처음 6자리를 가로챕니다. 2. 데이터베이스 bigint를 사용하여 자동으로 -필드를 증가시키고 16진수 형식으로 길이를 줄이세요.

PHP에서 반복되지 않는 6자리 문자열을 생성하는 방법

이 기사의 운영 환경: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.