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:
-
time_hi_and_version
(bits 4-7 del 7º octeto), -
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.