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

藏色散人
풀어 주다: 2023-03-11 08:04:01
원래의
3444명이 탐색했습니다.

PHP에서 문자열을 생성하는 유일한 비반복 방법: 1. md5로 현재 타임스탬프를 암호화하고 처음 6자리를 가로챕니다. 2. 데이터베이스 bigint를 사용하여 필드를 자동 증가시키고 62로 변환하여 단축합니다. 길이.

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

이 기사의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터

PHP는 어떻게 반복되지 않는 6자리 문자열을 생성합니까?

PHP는 6자리의 반복되지 않는 문자열을 생성합니다(UUID와 유사)

고려해야 할 사항:

1.

2. 보안.

【 不建议使用啥敏感的数据作为订单生成规则(例如:用户UID,订单自增ORDER_ID等),以为会暴露网站一些敏感信息】
로그인 후 복사

3. 대규모 랜덤코드는 사용이 불가능합니다.

why?
로그인 후 복사
  1. 먼저 "프로그래밍 언어에서 무작위성이 정말 무작위일 수 있습니까?"라고 묻고, 적어도 PHP는 할 수 없기 때문에 첫 번째 "아니요"로 이어질 수도 있다고 자신있게 말씀드릴 수 있습니다. 반복" 원칙
  2. 주문량이 1000만회에 도달하면 주문 코드를 생성할 때마다 1000만개의 과거 데이터를 비교해야 합니다. 일반적으로 500만회에 도달하면 데이터베이스 최적화에 시간을 투자해야 합니다(단순) 처리: 파티셔닝 및 인덱스 구축을 사용하지만 실제 요구 사항이 높고 기본 데이터베이스에서 작동해야 할 수도 있습니다. 물론 실시간 읽기 및 기타 최적화 방법이 있는지 궁금합니다. 여기서는 소개하지 않을 데이터베이스 작성).

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로 암호화되어 있습니다.

echo substr(md5(microtime(true)), 0, 6);
로그인 후 복사

2 데이터베이스 bigint를 사용하여 필드를 자동 증가시키고 16진수로 변환하여 길이를 줄입니다

echo gmp_strval(gmp_init('9876543210', 10), 62);
로그인 후 복사

권장: "PHP 비디오 튜토리얼"

위 내용은 PHP에서 고유하고 반복되지 않는 문자열을 생성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿