Heim  >  Artikel  >  Backend-Entwicklung  >  So generieren Sie in PHP eindeutige und sich nicht wiederholende Zeichenfolgen

So generieren Sie in PHP eindeutige und sich nicht wiederholende Zeichenfolgen

藏色散人
藏色散人Original
2021-07-03 11:40:433432Durchsuche

Die einzige sich nicht wiederholende Methode für PHP zum Generieren einer Zeichenfolge: 1. Verschlüsseln Sie den aktuellen Zeitstempel mit md5 und fangen Sie die ersten 6 Ziffern ab. 2. Verwenden Sie die Datenbank bigint, um das Feld automatisch zu erhöhen und in 62 zu konvertieren, um das Feld zu verkürzen Länge.

So generieren Sie in PHP eindeutige und sich nicht wiederholende Zeichenfolgen

Die Betriebsumgebung dieses Artikels: Windows 7-System, PHP Version 7.1, DELL G3-Computer

Wie generiert PHP eine 6-stellige, sich nicht wiederholende Zeichenfolge?

PHP generiert eine 6-stellige, sich nicht wiederholende Zeichenfolge (ähnlich der UUID)

Wir müssen Folgendes berücksichtigen:

1.

2. Sicherheit.

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

3. Große Zufallscodes können nicht verwendet werden.

why?
  1. Zuallererst frage ich Sie: „Kann Zufälligkeit in einer Programmiersprache wirklich zufällig sein?“ Ich kann Ihnen ohne Zuversicht sagen, dass zumindest PHP das nicht kann, sodass es zum ersten „Nein“ führen kann Wiederholungsprinzip
  2. Wenn Ihre Bestellmenge 10 Millionen Mal erreicht, müssen Sie jedes Mal, wenn Sie einen Bestellcode generieren, 10 Millionen historische Daten vergleichen. Wenn die Bestellmenge 5 Millionen erreicht, müssen Sie im Allgemeinen Zeit für die Datenbankoptimierung aufwenden (Einfache Verarbeitung: Partitionierung und Indexerstellung verwenden, aber die praktischen Anforderungen sind hoch und es muss möglicherweise unter der Hauptdatenbank betrieben werden. Ich frage mich, wie schmerzhaft das für Sie ist. Natürlich gibt es andere Optimierungsmethoden für Echtzeit Lesen und Schreiben der Datenbank, die hier nicht vorgestellt werden).

4. Parallelität verhindern.

5. Anzahl der Kontrollziffern.

why?
1. 便于查询检索
2 位数控制到 10-20位即可,当然网上将的是10~15缘由是利于输入,对于输入太长做好用户体验就好(新增复制订单按钮)

6. Versuchen Sie, geschäftliche Bedeutung zu haben (nicht zwingend erforderlich, je nach Geschäft des Unternehmens)

【当你业务比较庞大时候,或者后期有大规模的扩充时,建议考虑下订单的生成意义,根据公司的业务做调整。举个最简单的例子:"一个卖化妆品的商城,你需要根据订单来源来(pc/移动)来生成报表,这时候可能需要"】

Einfacher Weg:

1. Der aktuelle Zeitstempel ist MD5-verschlüsselt und die ersten 6 Ziffern werden abgefangen

// 类似生成 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);
}

2. Verwenden Sie die Datenbank bigint, um das Feld automatisch zu erhöhen und in Hexadezimal umzuwandeln, um die Länge zu verkürzen

echo substr(md5(microtime(true)), 0, 6);
Empfohlen: „

PHP Video Tutorial

Das obige ist der detaillierte Inhalt vonSo generieren Sie in PHP eindeutige und sich nicht wiederholende Zeichenfolgen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn