Was ist der Schneeflocken-Algorithmus? Lassen Sie mich zunächst eine Frage stellen: Wie kann man in einem verteilten System eine eindeutige ID generieren und dafür sorgen, dass die ID ungefähr von selbst ansteigt? Dies ist das wichtigste Geschäftsszenario bei Twitter, daher hat Twitter einen Schneeflockenalgorithmus eingeführt.
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 umfassen
die direkte Verwendung von Zeitstempeln oder eine Reihe von daraus abgeleiteten Methoden
Die UUID, die mit MySQL geliefert wird
Die beiden oben genannten Methoden sind zu finden, daher werde ich nicht viel erklären
Am Ende habe ich mich für den SnowFlake-Algorithmus von Twitter entschieden
Der Vorteil dieses Algorithmus ist sehr einfach. Er kann etwa 4 Millionen verschiedene 16-stellige IDs (dezimal) pro Sekunde generieren.
Das Prinzip ist sehr einfach
ID besteht aus einer 64-Bit-Komposition
Das erste Bit ist leer
41 Bit werden zum Speichern des Millisekunden-Zeitstempels verwendet
10 Bit werden zum Speichern der Maschinen-ID verwendet
12 Bit werden zum Speichern der selbst hinzugefügten ID verwendet
Mit Ausnahme des höchsten Bits, das als nicht verfügbar markiert ist, können die verbleibenden drei Gruppen von Bitpositionen 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);//反向计算时间戳
Hier bin ich. Es wurden Verbesserungen vorgenommen. Wenn die Maschinen-ID auf 0 übergeben wird, werden diese 10 Bits entfernt, da wir manchmal nicht so viele IDs verwenden.
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für alle hilfreich sein wird.
Verwandte Empfehlungen:
phpgenerierenineindeutige NummerID Methodenzusammenfassung, PHP generiert in id Zusammenfassung
[php] MySQL global ID generiert im -Schema, phpmysql global id
php generiert Detaillierte Erklärung der Methode, die einzige ID zu werden
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des SnowFlake-Algorithmus zum Generieren einer eindeutigen ID in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!