2008-10-08 21 views
15

Estoy tratando de generar una ID única en php para poder almacenar el contenido subido por el usuario en un FS sin conflictos. Estoy usando PHP, y por el momento este pequeño fragmento es responsable de generar el UID:Generando una ID única en PHP

$id = tempnam (".", ""); 
unlink($id); 
$id = substr($id, 2); 

Este código es horrible: se crea un archivo temporal en el FS y lo borra, conservando solamente la única parte relevante de la cadena generada

¿Hay alguna forma mejor de hacerlo, más preferiblemente sin dependencias externas?

¡Muchas gracias!

Respuesta

18
string uniqid ([ string $prefix [, bool $more_entropy ]]) 

Obtiene un identificador único prefijado basado en el tiempo actual en microsegundos.

USAGE: $id = uniqid(rand(), true); 
+0

¿No sería molesto con MD5 realmente hacer más probable generar colisiones? – nickf

+1

Estaba a punto de decir esto. Sha1 tiene menos colisiones, pero definitivamente hay ese problema en hash. Recuerde: cuanto más tiempo realice la identificación única, y cuantas más veces haga algo "aleatorio", menor será la probabilidad de colisión. –

+0

En realidad, veo que eres un punto, querías una ID, no un valor simbólico ... EDITADO. –

5

uniqid() es lo que está buscando en la mayoría de las situaciones prácticas.

Puede hacerlo aún más "uniq" agregando un gran número aleatorio después de él.

9

Dado que tanto uniqid() y rand() son funciones basadas en la hora actual, rand() añade casi no entropía, ya que el tiempo va a cambiar sólo una cantidad pequeña entre las llamadas respectivas.

Siempre que use la opción more_entropy, nunca debe tener una colisión dentro de un único servidor. Si usa clustering, asegúrese de incluir un prefijo que difiera entre los servidores.

Cuestiones relacionadas