PHP: Generando ID’s unicos

Debido al error en el Jaws cuando genero un Checkbox con muchísimos valores me aparece lo siguiente:

Fatal error: Maximum execution time of 30 seconds exceeded in /var/www/include/Extras/piwi/Utils/PiwiSmart.php on line 216

Y en la linea 216 del PiwiSmart se tiene la función GENERATE

<br /> function managePiwiIds($param, $action)<br /> {<br /> static $piwi_usedIds;</p>
<p> if (!isset($piwi_usedIds)) {<br /> $piwi_usedIds = array();<br /> }</p>
<p> switch($action) {<br /> case 'CHECK':<br /> return isset($piwi_usedIds[$param]);<br /> break;<br /> case 'GENERATE':<br /> while(true) {<br /> $id = $param . '_' . rand(1, 100);<br /> if (!isset($piwi_usedIds[$id])) {<br /> return $id;<br /> }<br /> }<br /> break;<br /> case 'REGISTER':<br /> $piwi_usedIds[$param] = true;<br /> break;<br /> }<br /> }<br /> 

Si observan se tiene un ciclo while y después se genera un numero random el cual se valida, si existe vuelve a generar otro numero, supongo que cuando se tiene varios ID iguales el ciclo se puede volver infinito y más por el error de la función RAND que de seguro siempre regresa los mismos números (entonces no ha de ser tan random??) y ademas solo permite hasta 100 números?? o me equivoco?, bueno, la solución a todo esto es quitar ese while y poner algo como sigue:

<br /> case 'GENERATE':<br /> return $param . '_' . uniqid(rand(), true);<br /> break;<br /> 

Confiando en la función uniqid de PHP :) , si tienen dudas ver documentación.

—————————

uniqid
(PHP 4, PHP 5)

uniqid ? Generar un ID único
Descripción
string uniqid ([ string $prefijo [, bool $mas_entropia ]] )

Obtiene un identificador con prefijo único basado en la hora actual en microsegundos.

Lista de parámetros

”prefijo”
Puede resultar útil, por ejemplo, si se generan identificadores simultáneamente en varias máquinas que pueden estar generando el identificador en el mismo microsegundo.

Con un prefijo vacío, la cadena devuelta tendrá una longitud de 13 caracteres. Si mas_entropia es TRUE, tendrá 23 caracteres.

”mas_entropia”
Si es TRUE, uniqid() agregará entropía adicional (usando el generador de congruencia lineal combinado) al final del valor de retorno, lo cual puede hacer más únicos los resultados.

Valores retornados

Devuelve el identificador único, como una cadena.

—————————–

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *