PHP-Funktion zum Generieren von v4 UUID

Lesezeit: 7 Minuten

PHP Funktion zum Generieren von v4 UUID
anomareh

Also habe ich etwas herumgegraben und versucht, eine Funktion zusammenzusetzen, die eine gültige v4-UUID in PHP generiert. Das ist das Naheste, was ich erreichen konnte. Meine Kenntnisse in Hex, Dezimal, Binär, PHPs bitweisen Operatoren und dergleichen sind fast nicht vorhanden. Diese Funktion generiert eine gültige v4-UUID bis zu einem Bereich. Eine v4-UUID sollte folgende Form haben:

xxxxxxxx-xxxx-4xxx-jxxx-xxxxxxxxxxxx

Woher j ist 8, 9, A oder B. Hier versagen die Funktionen, da sie sich nicht daran halten.

Ich hatte gehofft, dass mir jemand mit mehr Wissen in diesem Bereich helfen und mir helfen könnte, diese Funktion zu reparieren, damit sie sich an diese Regel hält.

Die Funktion ist wie folgt:

<?php

function gen_uuid() {
 $uuid = array(
  'time_low'  => 0,
  'time_mid'  => 0,
  'time_hi'  => 0,
  'clock_seq_hi' => 0,
  'clock_seq_low' => 0,
  'node'   => array()
 );
 
 $uuid['time_low'] = mt_rand(0, 0xffff) + (mt_rand(0, 0xffff) << 16);
 $uuid['time_mid'] = mt_rand(0, 0xffff);
 $uuid['time_hi'] = (4 << 12) | (mt_rand(0, 0x1000));
 $uuid['clock_seq_hi'] = (1 << 7) | (mt_rand(0, 128));
 $uuid['clock_seq_low'] = mt_rand(0, 255);
 
 for ($i = 0; $i < 6; $i++) {
  $uuid['node'][$i] = mt_rand(0, 255);
 }
 
 $uuid = sprintf('%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x',
  $uuid['time_low'],
  $uuid['time_mid'],
  $uuid['time_hi'],
  $uuid['clock_seq_hi'],
  $uuid['clock_seq_low'],
  $uuid['node'][0],
  $uuid['node'][1],
  $uuid['node'][2],
  $uuid['node'][3],
  $uuid['node'][4],
  $uuid['node'][5]
 );
 
 return $uuid;
}

?>

  • Wenn Sie Linux verwenden und ein wenig faul sind, können Sie sie mit generieren $newId = exec('uuidgen -r');

    – Jorge Garza

    5. Januar 2017 um 19:46 Uhr

  • Sie können diese Bibliothek verwenden: github.com/abmmhasan/UUID dann verwenden Sie einfach den Befehl: \AbmmHasan\Uuid::v4();

    – abmmhasan

    19. November 2021 um 16:08 Uhr

PHP Funktion zum Generieren von v4 UUID
Jack

Anstatt es in einzelne Felder zu zerlegen, ist es einfacher, einen zufälligen Datenblock zu generieren und die einzelnen Byte-Positionen zu ändern. Sie sollten auch einen besseren Zufallszahlengenerator als mt_rand() verwenden.

Entsprechend RFC 4122 – Abschnitt 4.4müssen Sie diese Felder ändern:

  1. time_hi_and_version (Bits 4-7 des 7. Oktetts),
  2. clock_seq_hi_and_reserved (Bit 6 & 7 des 9. Oktetts)

Alle anderen 122 Bits sollten ausreichend zufällig sein.

Der folgende Ansatz generiert 128 Bit Zufallsdaten unter Verwendung von openssl_random_pseudo_bytes()nimmt die Permutationen an den Oktetten vor und verwendet dann bin2hex() und vsprintf() um die endgültige Formatierung vorzunehmen.

function guidv4($data)
{
    assert(strlen($data) == 16);

    $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100
    $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10

    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}

echo guidv4(openssl_random_pseudo_bytes(16));

Mit PHP 7 ist das Generieren zufälliger Byte-Sequenzen noch einfacher zu verwenden random_bytes():

function guidv4($data = null)
{
    $data = $data ?? random_bytes(16);
    // ...
}

  • Eine Alternative für *nix-Benutzer, die nicht über die openssl-Erweiterung verfügen: $data = file_get_contents('/dev/urandom', NULL, NULL, 0, 16);

    – Iiridayn

    19. April 2013 um 20:49 Uhr

  • Außerdem würde ich OpenSSL viel mehr vertrauen als mt_rand.

    – Prof. Falken

    24. Mai 2013 um 7:08 Uhr

  • @BrunoAugusto es ist zufällig und es ist äußerst unwahrscheinlich (mit einer guten zufälligen Quelle), Duplikate zu erhalten, aber es ist eine gute Praxis, es auf Datenbankebene durchzusetzen.

    – Jack

    21. Juli 2016 um 14:04 Uhr

  • Gibt es einen Grund, den Aufruf random_bytes(16) NICHT in die guidv4-Funktion einzufügen und somit keine Parameter an guidv4 übergeben zu müssen?

    – Stefan R

    8. März 2017 um 23:59 Uhr

  • Kleine Verbesserung: Setzen Sie einen NULL-Standardwert für $data, und dann ist die erste Zeile der Funktion dies: $data = $data ?? random_bytes( 16 ); Jetzt KÖNNEN Sie Ihre eigene zufällige Datenquelle angeben oder die Funktion für Sie erledigen lassen. 🙂

    – Stefan R

    17. Mai 2018 um 17:23 Uhr

Genommen von Das Wenn Sie das PHP-Handbuch kommentieren, können Sie Folgendes verwenden:

function gen_uuid() {
    return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
        // 32 bits for "time_low"
        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),

        // 16 bits for "time_mid"
        mt_rand( 0, 0xffff ),

        // 16 bits for "time_hi_and_version",
        // four most significant bits holds version number 4
        mt_rand( 0, 0x0fff ) | 0x4000,

        // 16 bits, 8 bits for "clk_seq_hi_res",
        // 8 bits for "clk_seq_low",
        // two most significant bits holds zero and one for variant DCE1.1
        mt_rand( 0, 0x3fff ) | 0x8000,

        // 48 bits for "node"
        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
    );
}

  • Diese Funktion Wille Erstellen Sie Duplikate, also vermeiden Sie es, wenn Sie eindeutige Werte benötigen. Beachten Sie, dass mt_rand() bei gleichem Seed immer die gleiche Folge von Zufallszahlen erzeugt. Jedes Mal, wenn ein Seed wiederholt wird, wird also genau dieselbe UUID generiert. Um dies zu umgehen, müssten Sie es mit Zeit und Mac-Adresse säen, aber ich bin mir nicht sicher, wie Sie dies tun würden, da mt_srand() eine ganze Zahl erfordert.

    – Pavle Predic

    7. März 2013 um 9:27 Uhr

  • @PavlePredic mt_srand(crc32(serialisieren([microtime(true), ‘USER_IP’, ‘ETC’]))); (Ich bin ein anderer William: P)

    – Wilhelm

    24. März 2013 um 13:41 Uhr


  • Die PHP-Dokumentation weist ausdrücklich darauf hin, dass mt_rand() keine kryptografisch sicheren Werte generiert. Mit anderen Worten, die von dieser Funktion generierten Werte können vorhersagbar sein. Wenn Sie sicherstellen müssen, dass die UUIDs nicht vorhersehbar sind, sollten Sie lieber Jacks Lösung unten verwenden, die die Funktion openssl_random_pseudo_bytes() verwendet.

    – Richard Keller

    17. Juli 2013 um 8:36 Uhr

  • Was in aller Welt bringt es, eine UUID zu generieren, wenn Sie jedes Feld mit Müll füllen?

    – Evoli

    27. Mai 2016 um 6:40 Uhr

  • PHP 7.0+ definiert die Funktion random_bytes(), die immer kryptografisch sichere Zufallsbytes generiert oder eine Ausnahme auslöst, wenn dies nicht möglich ist. Das ist sogar besser als openssl_random_psuedo_bytes(), dessen Ausgabe unter Umständen manchmal nicht kryptografisch sicher ist.

    – Thomas Rutter

    12. Juli 2019 um 1:51 Uhr

Jeder, der verwendet Komponist Abhängigkeiten, sollten Sie diese Bibliothek in Betracht ziehen: https://github.com/ramsey/uuid

Einfacher geht es nicht:

Uuid::uuid4();

  • Oh, ich weiß nicht …. Fünf Zeilen Code im Vergleich zum Laden einer Bibliothek mit Abhängigkeiten? Ich bevorzuge Jacks Funktion. YMMV

    – Stefan R

    17. Mai 2018 um 23:25 Uhr

  • +1 an Stefan. Ramsey uuid hat viel mehr Funktionalität als nur uuid4. Ich will keine Banane!, hier hast du den ganzen Dschungel!

    – Geschworene

    4. Juli 2018 um 17:43 Uhr

  • UUIDs sind nicht nur zufällige Zeichenfolgen. Es gibt eine Spezifikation, wie es funktioniert. Um eine richtige zufällige UUID zu generieren, bei der ich mir keine Sorgen machen muss, dass sie später abgelehnt wird, verwende ich lieber eine getestete Bibliothek, als meine eigene Implementierung zu rollen.

    – Brandon

    19. November 2018 um 15:27 Uhr

  • Es ist eine UUIDv4. Es ist (meistens, aber für ein paar Bits) zufällig. Das ist keine Kryptografie. Paranoia gegen “selbst rollen” ist albern.

    – Gordon

    6. Februar 2019 um 21:08 Uhr


  • Der Aufwand für die Verwendung der Bibliothek ist nicht vorhanden, und das hat er Prüfungen. +1 dafür, dass Sie das Rad nicht neu erfinden.

    – istepaniuk

    6. Oktober 2020 um 11:56 Uhr

1646949248 208 PHP Funktion zum Generieren von v4 UUID
ThorBeschwörer

Verwenden Sie auf Unix-Systemen den Systemkern, um eine UUID für Sie zu generieren.

file_get_contents('/proc/sys/kernel/random/uuid')

Gutschrift Samveen an https://serverfault.com/a/529319/210994

Hinweis!: Wenn Sie diese Methode verwenden, um eine uuid zu erhalten, wird der Entropiepool tatsächlich sehr schnell erschöpft! Ich würde es vermeiden, dies zu verwenden, wenn es häufig aufgerufen wird.

PHP Funktion zum Generieren von v4 UUID
Danny Beckett

Eine leichte Variation von Jacks Antwort, um Unterstützung für PHP < 7 hinzuzufügen:

// Get an RFC-4122 compliant globaly unique identifier
function get_guid() {
    $data = PHP_MAJOR_VERSION < 7 ? openssl_random_pseudo_bytes(16) : random_bytes(16);
    $data[6] = chr(ord($data[6]) & 0x0f | 0x40);    // Set version to 0100
    $data[8] = chr(ord($data[8]) & 0x3f | 0x80);    // Set bits 6-7 to 10
    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}

// php version >= 7
$uuid = vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex(random_bytes(16)), 4));

Bei meiner Suche nach einem Erstellen einer v4-UUID bin ich zuerst auf diese Seite gestoßen und habe dann diese gefunden http://php.net/manual/en/function.com-create-guid.php

function guidv4()
{
    if (function_exists('com_create_guid') === true)
        return trim(com_create_guid(), '{}');

    $data = openssl_random_pseudo_bytes(16);
    $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100
    $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10
    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}

Kredit: pavel.volyntsev

Bearbeiten: Zur Verdeutlichung gibt Ihnen diese Funktion immer eine v4-UUID (PHP >= 5.3.0).

Wenn die Funktion com_create_guid verfügbar ist (normalerweise nur unter Windows), wird sie diese verwenden und die geschweiften Klammern entfernen.

Wenn nicht vorhanden (Linux), wird es auf diese starke zufällige openssl_random_pseudo_bytes-Funktion zurückgreifen, es wird dann vsprintf verwenden, um es in v4 uuid zu formatieren.

989090cookie-checkPHP-Funktion zum Generieren von v4 UUID

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy