Ver Mensaje Individual
  #38 (permalink)  
Antiguo 07/09/2013, 17:17
Onedy
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: Nombre irrepetible para imágenes

Cita:
Iniciado por PHPeros Ver Mensaje
Ok, todo aclarado. Pero si han conseguido desencriptar los paquetes SSL de https por vulnerabilidades, algún chino friki hará lo mismo con los de PHP. Saludos
De hecho, el algoritmo md5 se ha abandonado por esto mismo. El sha1 me parece que también lo dejó la NSA hace 10 años. Hay personas que se lo toman como un reto el demostrar que un algoritmo es vulnerable.

Cita:
Iniciado por ocp001a
El caso es casi igual: entre más archivos haya con el mismo nombre, más veces se tendrá que comprobar, con el añadido de tener que crear el aleatorio y luego el hash.
Eso es verdad, pero el "más" es muuuy pequeñito :D (sobre todo en las condiciones que te explicaré más abajo)
Hace unas horas escribí desde mi móvil pero parece que no llegó el último mensaje. Era sobre esto:


Cita:
Iniciado por ocp001a
La única ventaja sería si hay pocos archivos, pongamos por ejemplo un rango de 0 a 100, y ya se han subido 5 archivos.

Con mi método se tendría que comprobar 5 veces para que ya no se repitiera el nombre (patito 6).
Con tu método, es posible (de hecho muy probable) que a la primera nos diera un nombre diferente.
Ésta es una de las partes donde reside tu error: no debes crearte trabajo innecesario, es decir, si ya sabes que hay 5 patitos, por qué los vuelves a comprobar?

Cita:
Iniciado por ocp001a
Pero ahora supongamos para el mismo rango de 0 a 100 nombres, que ya se han ocupado 80.

Con mi método, se harán 80 comprobaciones.
Con tu método, tanto es posible que nos de un número libre a la primera como es posible que nos de números ocupados muchas veces, ya que sólo tiene el 20 por ciento de posibilidades de acertar a un número libre, con lo que es posible que se hagan más de 80 comprobaciones. Y entre menos números libres queden la cantidad de comprobaciones aumentará.

Si haces una simulación a obtener números libres en estas condiciones lo verás.
Aquí estás planteando mal el problema. Te explico.
a) Te estás creando complejidad y estás yendo por el peor caso: si puedes hacer 80 comprobaciones, pues las haces todas! :D Y si puedes hacer mil, haces mil, y si... no sigo :D
b) Yo no elijo nombres de entre un rango de 100, sino un número aleatorio entre 0 (o menos) y PHP_INT_MAX (6 082 244 480 221 302 255 en 32 bits).
De verdad crees que, aún dejándote el SISTEMA DE ARCHIVOS (NTFS permite "sólo" 4 294 967 295 archivos), vas a llegar siquiera a un 0,000000001 %? :D :D (no hablemos de un 80%) Es decir, la posibilidad de colisión puede considerarse ¡NULA! Pero un poco como dice Erick_MD9 (por fanatismo), un poco por evitar cualquier problema... comprobamos que no se repita un nombre.

Cita:
Iniciado por ocp001a
Por otro lado, el método que yo propuse es para pocos archivos y sin depender de llevar un registro, si se va a almacenar muchos archivos en la misma carpeta y se sabe que va a haber repetidos, se puede hacer simplemente guardando el último nombre, digamos que llegamos a patito999, el siguiente secuencia será patito1000 y ya está.

Supongamos la prima vez que se guarda la imagen patito.jpg

Almacenamos sólo el nombre en algún lugar "patito/0"

si suben otro patito.jpg, comprobamos que ya existe, por lo tanto aumentamos el índice y lo almacenamos "patito/1";
Si es para unos pocos archivos, no se nota. Pero ya mantener un registro de nombres de archivos... :D eso ya lo hace el sistema de archivos! No es eficiente. Además puede surgir algún desfase realidad - registro de nombres, con el tiempo.
________

En serio, no es difícil: generamos un número entre 0 y 6082244480221302255, le concatenas la extensión y ya estaa! :) Ni siquiera hace falta md5 ni sha1 ni nada. Perdonadme la expresión, pero es como mear en medio del océano pacífico, no vas a molestar a nadie. Y si por alguna casualidad de la vida en ese momento hay un naufrago a tu lado, pues te mueves 1000 km y seguro que no te encuentras ya a nadie. Espero que entiendas la comparación.

Y por último, si me he equivocado en algo, os ruego que me perdonéis, es muy tarde aquí :D

Última edición por Onedy; 07/09/2013 a las 17:24