Heim  >  Artikel  >  php教程  >  SnowFlake-Algorithmus zum Generieren eindeutiger IDs in PHP

SnowFlake-Algorithmus zum Generieren eindeutiger IDs in PHP

高洛峰
高洛峰Original
2016-12-28 15:33:501325Durchsuche

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!

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