2010-05-29 35 views
5

¿Qué función hash rápida está disponible para el iPhone en hash web urls (imágenes)?iPhone: función hash rápida para almacenar imágenes web (url) como archivos (nombres de archivos hash)

Me gustaría almacenar la imagen web almacenada en caché como un archivo con un hash como nombre de archivo, porque supongo que la url web cruda podría contener caracteres extraños que podrían causar problemas en el sistema de archivos.

La función hash no necesita ser criptográfica, pero definitivamente necesita ser rápida.

Ejemplo:

Entrada: http://www.calumetphoto.com/files/iccprofiles/icc-test-image.jpg

Salida: 3573ed9c4d3a5b093355b2d8a1468509

Esto se hizo mediante el uso de MD5(), pero ya no sé mucho sobre ese tema no lo hago saber si es excesivo (-> lento).

+0

Bueno, ya que estarás escribiendo el archivo en un sistema de archivos, prácticamente cualquier algoritmo hash será más que suficientemente rápido. Personalmente, me gustaría reemplazar los/personajes con porcentajes de escapes. – JeremyP

+1

JeremyP: Eso puede hacer que la ruta de acceso sea demasiado larga para un nombre de archivo. –

+0

@JeremyP: bueno, en la mayoría de los casos estaré cargando desde el sistema de archivos. Pero estás en lo correcto. Eso todavía es mucho más caro que el hash. – znq

Respuesta

11

MD5 puede estar roto por razones de seguridad, pero funciona bien para la situación que describes. Here's a thread sobre cómo implementarlo en iPhone. Mira la publicación de Vroomtrap. Para la posteridad, aquí está mi propia versión de ese código:

- (NSString *)MD5Hash { 
    const char *cStr = [self UTF8String]; 
    unsigned char result[CC_MD5_DIGEST_LENGTH]; 

    CC_MD5(cStr, strlen(cStr), result); 

    return [NSString stringWithFormat: @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 
     result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7], 
     result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15] ]; 
} 

Tendrá que importar la cabecera CommonCrypto/CommonDigest.h.

+1

Encontré este aquí muy útil: http: // www .saobart.com/md5-has-in-objective-c/ – znq

+0

Recomiendo usar 'dataUsingEncoding:' en lugar de 'UTF8String'.' strlen' no es barato, ya que tiene que recorrer toda la cadena para encontrar el final de ella para saber cuánto tiempo es. El objeto NSData sabe cuánto tiempo son los datos. –

+0

Eres bueno para hacerlo. Mis pruebas empíricas mostraron que el uso de dataUsingEncoding se realizó de la misma manera que el método anterior en cadenas de longitud moderada (200K) y sustancialmente peor en strings grandes (2M). – warrenm

0

Creo que el NSObject ya tiene una función hash. Y NSUrl o NSString pueden anularlo, ¿pueden intentarlo? Creo que en la mayoría de los casos, es lo suficientemente rápido, como ponemos NSString en NSDictionary :) NSObject hash

+0

Como valor de retorno obtengo un valor entero, que puedo convertir a una cadena y usarlo como un nombre de archivo. Sin embargo, ¿es eso lo suficientemente "fuerte" como para diferenciar entre las muchas URL diferentes que existen? ¿Qué tan probable es que dos URL diferentes resulten en el mismo hash? – znq

+0

No puedo encontrar ningún documento en google para eso :(. Pero creo que si tienes un número pequeño de URL (10 - 100, acabo de adivinar), puede estar bien. Pero descubrí que generalmente la gente usa MD5 para generar el hash, por lo que el rendimiento puede no ser un gran problema con MD5 – vodkhang

+0

Gracias. De hecho, compruebe el tiempo para ejecutar ambos, y MD5 es prácticamente el mismo que [myObject hash] – znq

Cuestiones relacionadas