Also habe ich ein bisschen herumgegraben und versucht, eine Funktion zusammenzusetzen, die eine gültige v4-UUID in PHP generiert. Dies ist der nächste, den ich kommen konnte. Mein Wissen über hexadezimale, dezimale, binäre, bitweise PHP-Operatoren und dergleichen ist nahezu nicht vorhanden. Diese Funktion generiert eine gültige v4-UUID bis zu einem Bereich. Eine v4-UUID sollte folgende Form haben:
xxxxxxxx-xxxx- 4 xxx- y xxx-xxxxxxxxxxxx
Dabei ist y 8, 9, A oder B. Hier schlagen die Funktionen fehl, da sie sich nicht daran halten.
Ich hatte gehofft, jemand mit mehr Wissen als ich in diesem Bereich könnte mir helfen und mir helfen, diese Funktion zu reparieren, damit sie dieser Regel entspricht.
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;
}
?>
Vielen Dank an alle, die mir helfen können.
$newId = exec('uuidgen -r');
Antworten:
Aus diesem Kommentar im PHP-Handbuch können Sie Folgendes verwenden:
quelle
Anstatt es in einzelne Felder zu unterteilen, ist es einfacher, einen zufälligen Datenblock zu generieren und die einzelnen Bytepositionen zu ändern. Sie sollten auch einen besseren Zufallszahlengenerator als mt_rand () verwenden.
Gemäß RFC 4122 - Abschnitt 4.4 müssen Sie diese Felder ändern:
time_hi_and_version
(Bits 4-7 des 7. Oktetts),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 zufälliger Daten unter Verwendung
openssl_random_pseudo_bytes()
, führt die Permutationen für die Oktette durch und verwendetbin2hex()
und führtvsprintf()
dann die endgültige Formatierung durch.Mit PHP 7 ist das Generieren von zufälligen Byte-Sequenzen noch einfacher, wenn
random_bytes()
:quelle
$data = file_get_contents('/dev/urandom', NULL, NULL, 0, 16);
$data = $data ?? random_bytes( 16 );
Jetzt können Sie Ihre eigene zufällige Datenquelle angeben oder die Funktion dies für Sie tun lassen. :-)Wenn Sie Composer- Abhängigkeiten verwenden, sollten Sie diese Bibliothek in Betracht ziehen: https://github.com/ramsey/uuid
Einfacher geht es nicht:
quelle
Verwenden Sie auf Unix-Systemen den Systemkern, um eine UUID für Sie zu generieren.
Credit Samveen unter https://serverfault.com/a/529319/210994
quelle
/dev/random
blockiert, wenn der Entropiepool erschöpft ist./dev/urandom
Dateiquelle finden, die meines Wissens nicht erschöpfen würden, aber die Gefahr birgen, doppelte Benutzeroberflächen zurückzugeben. Ich denke, es ist ein Kompromiss; Benötigen Sie wirklich eine eindeutige ID, die von der Systementropie beeinflusst wird?Bei meiner Suche nach einer v4-UUID bin ich zuerst auf diese Seite gekommen und habe diese dann auf http://php.net/manual/en/function.com-create-guid.php gefunden
Kredit: pavel.volyntsev
Bearbeiten: Zur Verdeutlichung erhalten Sie mit dieser Funktion immer eine v4-UUID (PHP> = 5.3.0).
Wenn die Funktion com_create_guid verfügbar ist (normalerweise nur unter Windows), wird sie verwendet und die geschweiften Klammern entfernt.
Wenn es nicht vorhanden ist (Linux), greift es auf diese starke zufällige Funktion openssl_random_pseudo_bytes zurück und formatiert sie dann mit vsprintf in v4 uuid.
quelle
Meine Antwort basiert auf einem Kommentar uniqid Benutzerkommentar , verwendet jedoch die Funktion openssl_random_pseudo_bytes , um eine zufällige Zeichenfolge zu generieren, anstatt aus zu lesen
/dev/urandom
quelle
Wenn Sie verwenden
CakePHP
, können Sie ihre MethodeCakeText::uuid();
aus der CakeText- Klasse verwenden, um eine RFC4122- UUID zu generieren.quelle
Eine leichte Variation von Jacks Antwort , um Unterstützung für PHP <7 hinzuzufügen:
quelle
Inspiriert von Broofas Antwort hier .
Oder wenn anonyme Funktionen nicht verwendet werden können.
quelle
mt_rand()
, dass Zufälligkeit nicht garantiert ist.Nachdem ich genau das Gleiche gesucht und fast selbst eine Version davon implementiert hatte, fand ich es erwähnenswert, dass WP , wenn Sie dies in einem WordPress- Framework tun , eine eigene superhandliche Funktion für genau dies hat:
$myUUID = wp_generate_uuid4();
Die Beschreibung und die Quelle können Sie hier lesen .
quelle
false
🤷Wie wäre es mit MySQL, um die UUID für Sie zu generieren?
quelle
UUID()
Funktion von MySQL erstellt v1-Benutzeroberflächen.quelle
Von Tom auf http://www.php.net/manual/en/function.uniqid.php
quelle
/dev/urandom
sollte in Ordnung sein -/dev/random
sollte nur zur Generierung von langfristigen kryptografischen Schlüsseln verwendet werden.mt_rand()
wenn nichts schicker verfügbar ist.random_bytes()
in PHP 7 verwenden und los geht's :-)Ich bin sicher, es gibt eine elegantere Möglichkeit, die Konvertierung von binär in dezimal für die Teile
4xxx
undyxxx
durchzuführen. Aber wenn Sieopenssl_random_pseudo_bytes
als Ihren krytographisch sicheren Zahlengenerator verwenden möchten, verwende ich Folgendes:quelle
Verwenden Symfony Polyfill / Uuid
Dann können Sie einfach UUID als native PHP - Funktion erzeugen:
Weitere Informationen finden Sie im offiziellen Symfony-Blop-Beitrag - https://symfony.com/blog/introducing-the-new-symfony-uuid-polyfill
quelle