Ver Mensaje Individual
  #5 (permalink)  
Antiguo 28/12/2009, 01:57
bauhaus1975
 
Fecha de Ingreso: agosto-2003
Ubicación: Málaga, España
Mensajes: 419
Antigüedad: 21 años, 6 meses
Puntos: 1
Respuesta: Hash de longitud determinada

Hola de nuevo.
Con la solución que propones necesito una cadena de partida de X caracteres como entrada a la función de codificar. Podría coger esos X caracteres del email y codificar, pero he pensado otra cosa que creo que me viene mejor. Este sería el proceso:

- Si el usuario no tiene código asignado/almacenado generar (hasta que no exista colisión) uno con la función de generación aleatoria que más abajo detallo.
- Almacenar el código en el registro del usuario. cada usuario tendrá su código, con esa función y para un número relativamente alto de usuarios es dificil que exista colisión pues la semilla del random está basado un caracter temporal.
- Validar el usuario es fácil, simplemente comprobar el código que cada usuario tenga almacenado.

Esta es la función. Genera cadenas aleatorias de longitud X
(esta sacada de osCommerce)

Código PHP:
function tep_create_random_value($length$type 'mixed') {
// length es la longitud de la cadena aleatoria a devolver
// type puede ser (mixed,digits,chars)
    
if ( ($type != 'mixed') && ($type != 'chars') && ($type != 'digits')) return false;
    
$rand_value '';
    while (
strlen($rand_value) < $length) {
        if (
$type == 'digits') {
            
$char tep_rand(0,9);
      } else {
        
$char chr(tep_rand(0,255));
      }
      if (
$type == 'mixed') {
        if (
eregi('^[a-z0-9]$'$char)) $rand_value .= $char;
      } elseif (
$type == 'chars') {
        if (
eregi('^[a-z]$'$char)) $rand_value .= $char;
      } elseif (
$type == 'digits') {
        if (
ereg('^[0-9]$'$char)) $rand_value .= $char;
      }
    }
    return 
$rand_value;
}

function 
tep_rand($min null$max null) {
    static 
$seeded;
    if (!isset(
$seeded)) {
      
mt_srand((double)microtime()*1000000);
      
$seeded true;
    }
    if (isset(
$min) && isset($max)) {
      if (
$min >= $max) {
        return 
$min;
      } else {
        return 
mt_rand($min$max);
      }
    } else {
      return 
mt_rand();
    }
  } 
Espero estos comentarios hayan aportado un poco más de materia al tema.
Gracias por vuestra ayuda.