Vuelvo a joderlos: Creo que tengo la solucion
Que pasa si en vez de colocar en CODIGO, el resultado del MD5 del LINK, coloco: el resultado del CRC32 del link y el CRC32 de la concatenacion de los numeros que hay en la columna HASH1, HASH2, y HASH3?
Lean ésto por favor:
Mi tabla, se llama: IMGS, que contiene los siguientes campos:
CODIGO << aqui se guardaba el crc32 o el md5
LINK << aca hay links SOLAMENTE DE IMAGENES.. SOLAMENTE!!
HASH1 << aca se guardala cantidad de color ROJO que tiene la imagen
HASH2 << aca se guarda la cantidad de color VERDE que tiene la imagen
HASH3 << aca se guarda la cantidad de color AZUL que tiene la imagen
Ahora bien.. Mi indexador, tiene en otra base de datos, LINKS de IMAGENES A PROCESAR.
Mi indexador toma de esa base de datos (que esta en mi PC) 1 link.
Descarga ese link, mira la cantidad de colores que tiene (analizando los pixeles) y hace al final:
INSERT INTO imgs (codigo, link, hash1, hash2, hash3) VALUES ('XXXXXXXX', '
www.google.com/logo.jpg', '123', '912', '465');
OK?? se entiende?
Bien.. El problema, es QUE GUARDAR EN CODIGO? ese fue nuestro problema desde que empezamos con ésta idea..
Pues bien, se me ocurrió algo genial!
Guardar ahí, en el campo CODIGO, el resultado de 2 crc32 concatenados.. para así aumentar a 2^64 la longitud de los resultados, y disminuir MUCHISIMO la posibilidad de coliciones.
Cuales serían los 2 CRC32 a calcular?
1º: el crc32 del LINK
2º, el CRC32 de HASH1HASH2HASH3
Porque digo que sería bueno?
Supongamos que 2 link de imagenes, son TOTALMENTE DIFERENTES, ejemplo:
A =
www.noel.com/foto.jpgB =
www.foro.com/foto.jpgPero, ambos links, aplicandole el CRC32, devuelven el mismo resultado (COLICION), el cual es: 123456789
Problema: Al querer agregar estos links, uno de los 2 no se agregará, ya que el que ingrese primero, no permitirá al 2º entrar, porque el campo CODIGO (que posee hasta el momento 1 solo CRC32 del LINK) tienen el MISMO VALOR DE CRC32.
PERO!, esas 2 imagenes, son TOTALMENTE DIFERENTES (obviamente), entonces sus valores de HASH1, HASH2, y HASH3, TAMBIEN!, ya que contienen diferentes cantidades de colores en cada pixel.
Supongamos:
A =
www.noel.com/foto.jpg | HASH1=123 | HASH2=234 | HASH3=345
B =
www.foro.com/foto.jpg | HASH1=567 | HASH2=678 | HASH3=789
En este caso, si en CODIGO, colocamos los 2 CRC32, de ésta manera:
CODIGO=CRC32='
www.noel.com/foto.jpg'CRC32='123234345'LA UNICA MANERA de dar la COLICION, sería que el CRC32 de los 2 links SEAN IGUALES, y el CRC32 de los valores CONCATENADOS que hay en HASH1, HASH2, y HASH3, TAMBIEN DEVUELVAN EL MISMO VALORRR!!!...
SERÍA EXTREMADAMENTE MUCHA CASUALIDAD!!!!!
Todo funcionaría perfectamente.. PORQUE?
Porque si es EL MISMO LINK, entonces, los valores de los 3 HASH, SERAN IGUALES TAMBIEN. ya que es la misma imagen, por ENDE, los valores serían iguales tanto en el resultado del CRC32 del link como el de CRC32 de los hash. Y NO SE INGRESARÍA EL LINK, por duplicidad en la KEY PRIMARIA.
Que pasa si 2 imagenes son iguales, COPIAS, pero estan guardadas en 2 webs diferentes.. entonces, tendrán el mismo CRC32 de sus HASHES, pero diferentes en el CRC32 de su link (a no ser que se de una colicion ahí, pero las probabilidades son casi nulas)
Que ventaja tiene ésto?
La Key sería SOLAMENTE de NUMEROS, de una longitud de 20, (si mal no recuerdo, CRC32 devuelve un numero de HASTA 10 sifras), y con esa longitud, no habrá casi coliciones. Disminuiré mucho el peso de la base de datos, ya que el MD5 tiene 32 caracteres de longitud. y el indice será solo de NUMEROS...
Habra muchas coliciones por los links, pero el 2º crc32, hará la diferencia
Y si 20 carateres, es poco para evitar coliciones, entonces, podria concatenar 3 crc32, por ejemplo, del LINK, del 1º y 2º HASH y del 3º HASH
QUE ME DICEN?