
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;
}
?>

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:
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 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);
// ...
}
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 )
);
}
Jeder, der verwendet Komponist Abhängigkeiten, sollten Sie diese Bibliothek in Betracht ziehen: https://github.com/ramsey/uuid
Einfacher geht es nicht:
Uuid::uuid4();

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.

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.
9890900cookie-checkPHP-Funktion zum Generieren von v4 UUIDyes
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