Vorwort: Ich musste kürzlich ein CMS-System aufbauen, da die Funktionen relativ einfach und die Anforderungen flexibel sind, habe ich ein ausgereiftes System wie WP aufgegeben und selbst ein relativ einfaches aufgebaut. Die URL der Artikeldetailseite möchte in ein pseudostatisches URL-Format umgewandelt werden, d sagte, dass der Anfangswert höher eingestellt werden kann, es aber immer noch möglich ist. Die Anzahl der Artikel innerhalb eines Zeitraums wird basierend auf der ID-Differenz berechnet, daher ist ein Algorithmus erforderlich, der eindeutige IDs generieren kann.
Die berücksichtigten Methoden sind
direkte Verwendung des Zeitstempels oder einer Reihe von davon abgeleiteten Methoden
Mysqls eigene UUID
Die beiden oben genannten Methoden gefunden werden kann, daher werde ich nicht zu viel erklären
Am Ende habe ich mich für den SnowFlake-Algorithmus von Twitter entschieden
Der Vorteil dieses Algorithmus ist sehr einfach und er kann etwa 4 Millionen verschiedene 16 generieren Nachrichten pro Sekunde. Digitale ID (dezimal)
Das Prinzip ist sehr einfach
ID besteht aus 64 Bits
Das erste Bit ist leer
41 Bit wird zum Speichern des Millisekunden-Level-Zeitstempels verwendet
10 Bits werden zum Speichern der Maschinen-ID verwendet
12 Bits werden zum Speichern der Auto-Inkrement-ID verwendet
Mit Ausnahme des höchsten Bits Als nicht verfügbar markiert, sind die verbleibenden drei Bitgruppen belegt. Alle können je nach spezifischen Geschäftsanforderungen schwebend sein. Standardmäßig kann der 41-Bit-Zeitstempel die Verwendung dieses Algorithmus bis 2082 unterstützen, die 10-Bit-Arbeitsmaschinen-ID kann 1023 Maschinen unterstützen und die Seriennummer unterstützt 1 Millisekunde zum Generieren von 4095 automatisch inkrementierenden Sequenz-IDs.
Das Folgende ist der PHP-Quellcode
<?php namespace App\Services; abstract class Particle { const EPOCH = 1479533469598; const max12bit = 4095; const max41bit = 1099511627775; static $machineId = null; public static function machineId($mId = 0) { self::$machineId = $mId; } public static function generateParticle() { /* * Time - 42 bits */ $time = floor(microtime(true) * 1000); /* * Substract custom epoch from current time */ $time -= self::EPOCH; /* * Create a base and add time to it */ $base = decbin(self::max41bit + $time); /* * Configured machine id - 10 bits - up to 1024 machines */ if(!self::$machineId) { $machineid = self::$machineId; } else { $machineid = str_pad(decbin(self::$machineId), 10, "0", STR_PAD_LEFT); } /* * sequence number - 12 bits - up to 4096 random numbers per machine */ $random = str_pad(decbin(mt_rand(0, self::max12bit)), 12, "0", STR_PAD_LEFT); /* * Pack */ $base = $base.$machineid.$random; /* * Return unique time id no */ return bindec($base); } public static function timeFromParticle($particle) { /* * Return time */ return bindec(substr(decbin($particle),0,41)) - self::max41bit + self::EPOCH; } } ?>
Die Aufrufmethode ist wie folgt
Particle::generateParticle($machineId);//生成ID Particle::timeFromParticle($particle);//反向计算时间戳
Ich habe hier Verbesserungen vorgenommen. Wenn die Maschinen-ID 0 übergeben wird, wird die 10 Bits werden entfernt, weil wir sie manchmal nicht benötigen. Es gibt so viele IDs
Weitere Artikel zum SnowFlake-Algorithmus zum Generieren eindeutiger IDs in PHP finden Sie auf der chinesischen PHP-Website!