Heim > Artikel > Backend-Entwicklung > So generieren Sie in PHP eine 6-stellige, sich nicht wiederholende Zeichenfolge
So generieren Sie eine 6-stellige, sich nicht wiederholende Zeichenfolge in PHP: 1. Fangen Sie die ersten 6 Ziffern durch „substr(md5(microtime(true)), 0, 6);“ ab. 2. Verwenden Sie die Datenbank bigint für auto -Erhöhen Sie das Feld und konvertieren Sie es in. Verkürzen Sie einfach die Länge im Hexadezimalformat.
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 -wiederholende Zeichenfolge (ähnlich der UUID)
Wir müssen Folgendes berücksichtigen:
1. Keine Duplizierung.
2. Sicherheit.
【Es wird nicht empfohlen, sensible Daten als Regeln für die Auftragsgenerierung zu verwenden (z. B. Benutzer-UID, ORDER_ID für die automatische Erhöhung der Bestellung usw.), da man davon ausgeht, dass dadurch einige sensible Informationen der Website preisgegeben werden.】
3. Maßstabs-Zufallscodes können nicht verwendet werden.
Warum?
Zuallererst frage ich Sie: „Kann Zufälligkeit in einer Programmiersprache wirklich zufällig sein?“ Ich kann Ihnen ohne Zuversicht sagen, dass zumindest PHP dies nicht kann, sodass es zum ersten „keine Wiederholung“ führen kann "Prinzip
Wenn Ihre Bestellmenge 10 Millionen Mal erreicht, müssen Sie jedes Mal, wenn Sie einen Bestellcode generieren, 10 Millionen historische Daten vergleichen. Im Allgemeinen müssen Sie bei Erreichen von 5 Millionen Zeit in die Datenbankoptimierung investieren ( Einfache Verarbeitung: Partitionierung verwenden, Indizes erstellen. Die praktischen Anforderungen sind jedoch hoch und ich frage mich, wie schmerzhaft es für Sie ist Lesen und Schreiben der Datenbank, die hier nicht vorgestellt werden).
4. Parallelität verhindern.
5. Anzahl der Kontrollziffern.
warum?
Bequem zum Abfragen und Abrufen
Die Anzahl der Ziffern kann auf 10–20 eingestellt werden, da dies für die Eingabe geeignet ist, wenn die Eingabe zu lang ist
6 Versuchen Sie, eine geschäftliche Bedeutung zu haben (nicht zwingend erforderlich, basierend auf dem Geschäft des Unternehmens)
[Wenn Ihr Unternehmen relativ groß ist, oder es groß sein wird Bei einer künftigen Erweiterung wird empfohlen, die Bedeutung der Auftragserteilung entsprechend anzupassen. Nehmen Sie das einfachste Beispiel: „Ein Einkaufszentrum, das Kosmetika verkauft, Sie müssen Berichte basierend auf der Bestellquelle (PC/Mobilgerät) erstellen, dies kann erforderlich sein“]
7 Lösung
// 类似生成 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); }
Einfache Möglichkeit:
1 .Die aktuelle Der Zeitstempel ist MD5-verschlüsselt und die ersten 6 Ziffern werden abgefangen
Das obige ist der detaillierte Inhalt vonSo generieren Sie in PHP eine 6-stellige, sich nicht wiederholende Zeichenfolge. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!