uniqid online length example ejemplos php

length - uniqid php online



¿Qué tan único es uniqid? (5)

Esta pregunta no es realmente un problema en busca de una solución, es más simplemente una cuestión de simple curiosidad. La función PHP uniqid tiene un indicador de entropía más, para hacer que la salida sea "más única". Esto me hizo preguntarme, ¿qué tan probable es para esta función producir el mismo resultado más de una vez cuando more_entropy es verdadero, en comparación con cuando no lo es? En otras palabras, ¿qué tan único es uniqid cuando more_entropy está habilitado, frente a cuando está deshabilitado? ¿Hay algún inconveniente para tener more_entropy habilitado todo el tiempo?


De las discusiones sobre la función en el sitio manual de PHP:

Como se señala a continuación, sin prefijo y sin "entropía agregada", esta función simplemente devuelve la indicación de tiempo UNIX con un contador de microsegundos añadido como número hexadecimal; es más o menos solo microtime (), en forma de hexit.

[...]

También vale la pena tener en cuenta que dado que microtime () solo funciona en sistemas que tienen gettimeofday ()> present, lo que Windows NO OFRECE de manera nativa, uniqid () puede producir solo la marca de tiempo UNIX de resolución única en un entorno de Windows.

En otras palabras, sin "more_entropy", la función es absolutamente horrible y nunca debe usarse, punto. Según la documentación, la bandera usará un "generador congruente lineal combinado" para "agregar entropía". Bueno, ese es un RNG bastante débil. Así que omitiría esta función por completo y usaría algo basado en mt_rand con una buena semilla para las cosas que no son relevantes para la seguridad, y SHA-256 para las cosas que sí lo son.


El bit relevante del código fuente es

if (more_entropy) { uniqid = strpprintf(0, "%s%08x%05x%.8F", prefix, sec, usec, php_combined_lcg() * 10); } else { uniqid = strpprintf(0, "%s%08x%05x", prefix, sec, usec); }

Entonces more_entropy agrega nueve dígitos decimales algo aleatorios ( php_combined_lcg() devuelve un valor en (0,1) ) - eso es 29.9 bits de entropía, tops (en realidad probablemente menos ya que LCG no es un generador de números pseudoaleatorios criptográficamente seguros).


Las cosas solo son únicas si comprueba que ya no existen. No importa qué función use para generar una cadena ''aleatoria'', o ID: si no verifica dos veces que no es un duplicado, entonces siempre hay esa posibilidad ...;)

Mientras que uniqid se basa en la hora actual, la nota de advertencia anterior aún se aplica, solo depende de dónde va a utilizar estos "ID únicos". La clave de todo esto es donde dice "más único". Unique es único es único. ¡Cómo puede tener algo que es más o menos único, es un poco confuso para mí!

Verificando como arriba, y combinando todo esto, te permitirá terminar con algo que se aproxima a la unicidad, pero todo es relativo a dónde se usarán las claves y el contexto. ¡Espero que ayude!


Sin la bandera more_unique, devuelve la marca de tiempo de unix con un contador de microsegundos, por lo tanto, si se hacen dos llamadas en el mismo microsegundo, entonces devolverán la misma identificación "única".

A partir de ahí, se trata de qué tan probable es eso. La respuesta es, no muy, pero no a un grado de descuento. Si necesita una ID única y la genera con frecuencia (o trabaja con datos generados en otro lugar), no cuente con que sea absolutamente única.


Actualización, marzo de 2014:

En primer lugar, es importante tener en cuenta que uniqid es un nombre poco uniqid ya que no garantiza una identificación única.

Según la documentación de PHP :

¡ADVERTENCIA!

Esta función no crea una cadena aleatoria ni impredecible. Esta función no debe usarse por razones de seguridad. Utilice función / generador aleatorio criptográficamente seguro y funciones hash criptográficamente seguras para crear una identificación segura impredecible.

Y

Esta función no genera tokens criptográficamente seguros, de hecho, sin pasar ningún parámetro adicional, el valor de retorno es poco diferente de microtime() . Si necesita generar tokens criptográficamente seguros, use openssl_random_pseudo_bytes() .

Establecer más entropía en verdadero genera un valor más único, sin embargo, el tiempo de ejecución es más largo (aunque en un pequeño grado), de acuerdo con los documentos:

Si se establece en TRUE, uniqid () agregará entropía adicional (usando el generador congruente lineal combinado) al final del valor de retorno, lo que aumenta la probabilidad de que el resultado sea único.

Tenga en cuenta que la línea increases the likelihood that the result will be unique y que no garantiza la exclusividad.

Puedes esforzarte "infinitamente" por la exclusividad, hasta cierto punto, y mejorar el uso de cualquier cantidad de rutinas de encriptación, agregar salts y cosas similares, depende del propósito.

Recomiendo mirar los comentarios sobre el tema principal de PHP, en particular:

http://www.php.net/manual/en/function.uniqid.php#96898

http://www.php.net/manual/en/function.uniqid.php#96549

http://www.php.net/manual/en/function.uniqid.php#95001

Lo que recomendaría es averiguar por qué necesita exclusividad, ¿es por seguridad (es decir, para agregar a una rutina de cifrado / cifrado)? Además, ¿qué tan único necesita ser? Finalmente, mira la consideración de la velocidad. La idoneidad cambiará con las consideraciones subyacentes.