Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erläuterung des SnowFlake-Algorithmus zum Generieren einer eindeutigen ID in PHP

Detaillierte Erläuterung des SnowFlake-Algorithmus zum Generieren einer eindeutigen ID in PHP

墨辰丷
墨辰丷Original
2018-05-29 15:01:401700Durchsuche

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

  1. die direkte Verwendung von Zeitstempeln oder eine Reihe von daraus abgeleiteten Methoden

  2. 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!

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