w3schools uniqid ramsey online generate generar example php function uuid

uniqid - unique id php example



FunciĆ³n PHP para generar v4 UUID (11)

¿Qué hay de usar mysql para generar el uuid para usted?

$conn = new mysqli($servername, $username, $password, $dbname, $port); $query = ''SELECT UUID()''; echo $conn->query($query)->fetch_row()[0];

Así que he estado investigando y he intentado reconstruir una función que genera un UUID v4 válido en PHP. Esto es lo más cerca que he podido venir. Mi conocimiento en operadores bit a bit hexadecimales, decimales, binarios, de PHP y similares casi no existe. Esta función genera un UUID v4 válido hasta un área. Un UUID v4 debe tener la forma de:

xxxxxxxx-xxxx- 4 xxx- y xxx-xxxxxxxxxxxx

donde y es 8, 9, A o B. Aquí es donde las funciones fallan ya que no se adhiere a eso.

Esperaba que alguien con más conocimiento que yo en esta área pudiera echarme una mano y ayudarme a arreglar esta función para que se adhiera a esa regla.

La función es la siguiente:

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

Gracias a cualquiera que pueda ayudarme.


Cualquiera que use dependencias de compositor , es posible que desee considerar esta biblioteca: https://github.com/ramsey/uuid

No hay nada más fácil que esto:

Uuid::uuid4();


Desde tom, en http://www.php.net/manual/en/function.uniqid.php

$r = unpack(''v*'', fread(fopen(''/dev/random'', ''r''),16)); $uuid = sprintf(''%04x%04x-%04x-%04x-%04x-%04x%04x%04x'', $r[1], $r[2], $r[3], $r[4] & 0x0fff | 0x4000, $r[5] & 0x3fff | 0x8000, $r[6], $r[7], $r[8])


En lugar de dividirlo en campos individuales, es más fácil generar un bloque aleatorio de datos y cambiar las posiciones de bytes individuales. También debe usar un generador de números aleatorios mejor que mt_rand ().

De acuerdo con RFC 4122 - Sección 4.4 , necesita cambiar estos campos:

  1. time_hi_and_version (bits 4-7 del 7º octeto),
  2. clock_seq_hi_and_reserved (bit 6 y 7 del noveno octeto)

Todos los otros 122 bits deben ser lo suficientemente aleatorios.

El siguiente enfoque genera 128 bits de datos aleatorios usando openssl_random_pseudo_bytes() , realiza las permutaciones en los octetos y luego utiliza bin2hex() y vsprintf() para realizar el formateo final.

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));

Con PHP 7, generar secuencias de bytes aleatorias es incluso más simple usando random_bytes() :

echo guidv4(random_bytes(16));


En mi búsqueda para crear un v4 uuid, llegué primero a esta página, luego encontré esto en 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)); }

crédito: pavel.volyntsev

Editar: para aclarar, esta función siempre le dará un v4 uuid (PHP> = 5.3.0).

Cuando la función com_create_guid está disponible (generalmente solo en Windows), usará eso y quitará las llaves.

Si no está presente (Linux), recurrirá a esta fuerte función aleatoria openssl_random_pseudo_bytes, y luego usará vsprintf para formatearlo en v4 uuid.


Inspirado por la respuesta de broofa here .

preg_replace_callback(''/[xy]/'', function ($matches) { return dechex(''x'' == $matches[0] ? mt_rand(0, 15) : (mt_rand(0, 15) & 0x3 | 0x8)); } , ''xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'');

O si no puede usar funciones anónimas.

preg_replace_callback(''/[xy]/'', create_function( ''$matches'', ''return dechex("x" == $matches[0] ? mt_rand(0, 15) : (mt_rand(0, 15) & 0x3 | 0x8));'' ) , ''xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'');


Más bien tardía, lo sé, pero esta fue mi respuesta:

function NewGuid() { if (function_exists(''com_create_guid'')){ /** * @var Guid $uuid */ $uuid = com_create_guid(); print "com created"; return $uuid; } else { mt_srand((double)microtime()*10000); $charid = strtoupper(md5(uniqid(rand(), true))); $hyphen = chr(45); /** * @var Guid $uuid */ $uuid = substr($charid, 0, 8).$hyphen .substr($charid, 8, 4).$hyphen .substr($charid,12, 4).$hyphen .substr($charid,16, 4).$hyphen .substr($charid,20,12); return $uuid; } }


Mi respuesta se basa en un comentario del usuario uniqid, pero usa la función openssl_random_pseudo_bytes para generar una cadena aleatoria en lugar de leer desde /dev/urandom

function guid() { $randomString = openssl_random_pseudo_bytes(16); $time_low = bin2hex(substr($randomString, 0, 4)); $time_mid = bin2hex(substr($randomString, 4, 2)); $time_hi_and_version = bin2hex(substr($randomString, 6, 2)); $clock_seq_hi_and_reserved = bin2hex(substr($randomString, 8, 2)); $node = bin2hex(substr($randomString, 10, 6)); /** * Set the four most significant bits (bits 12 through 15) of the * time_hi_and_version field to the 4-bit version number from * Section 4.1.3. * @see http://tools.ietf.org/html/rfc4122#section-4.1.3 */ $time_hi_and_version = hexdec($time_hi_and_version); $time_hi_and_version = $time_hi_and_version >> 4; $time_hi_and_version = $time_hi_and_version | 0x4000; /** * Set the two most significant bits (bits 6 and 7) of the * clock_seq_hi_and_reserved to zero and one, respectively. */ $clock_seq_hi_and_reserved = hexdec($clock_seq_hi_and_reserved); $clock_seq_hi_and_reserved = $clock_seq_hi_and_reserved >> 2; $clock_seq_hi_and_reserved = $clock_seq_hi_and_reserved | 0x8000; return sprintf(''%08s-%04s-%04x-%04x-%012s'', $time_low, $time_mid, $time_hi_and_version, $clock_seq_hi_and_reserved, $node); } // guid


Si usa CakePHP puede usar su método CakeText::uuid(); de la clase CakeText para generar un uuid RFC4122.


Tomado de this comentario en el manual de PHP, podrías usar esto:

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


en los sistemas Unix, use el kernel del sistema para generar un uuid para usted.

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

Credit Samveen en https://serverfault.com/a/529319/210994

¡Nota !: ¡Usar este método para obtener un uuid de hecho agota el conjunto de entropía, muy rápidamente! Evitaría usar esto donde se llamaría con frecuencia.