2010-05-29 14 views
5

Che cos'è una funzione di hash veloce disponibile per iPhone per gli hash URL (immagini)?iPhone: funzione di hash veloce per la memorizzazione di immagini Web (url) come file (nomi di file con hash)

Vorrei archiviare l'immagine Web memorizzata nella cache come file con un hash come nome file, perché suppongo che l'URL Web raw possa contenere caratteri strani che potrebbero causare problemi nel file system.

La funzione di hash non ha bisogno di essere crittografica, ma deve essere sicuramente veloce.

Esempio:

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

uscita: 3573ed9c4d3a5b093355b2d8a1468509

Ciò è stato fatto utilizzando MD5(), ma dal momento che non so molto su questo argomento non lo faccio sapere se è eccessivo (-> lento).

+0

Bene visto che scriverai il file su un file system, praticamente qualsiasi algoritmo di hashing sarà più che abbastanza veloce. Personalmente, mi piacerebbe solo sostituire i/caratteri con percentuali di escape. – JeremyP

+1

JeremyP: Questo potrebbe rendere il nome del percorso troppo lungo per un nome file. –

+0

@JeremyP: beh, nella maggior parte dei casi caricherò dal file system. Ma hai ragione. È ancora molto più costoso dell'hashing. – znq

risposta

11

MD5 può essere danneggiato per motivi di sicurezza, ma funziona bene per la situazione che descrivi. Here's a thread su come implementarlo su iPhone. Dai un'occhiata al post di Vroomtrap. Ai posteri, ecco la mia versione di tale codice:

- (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] ]; 
} 

Avrai bisogno di importare l'intestazione CommonCrypto/CommonDigest.h.

+1

Ho trovato questo molto utile qui: http: // www .saobart.com/md5-has-in-objective-c/ – znq

+0

Si consiglia di utilizzare 'dataUsingEncoding:' invece di 'UTF8String'.' strlen' non è economico, poiché deve percorrere l'intera stringa per trovare la fineper sapere quanto è lungo. L'oggetto NSData sa per quanto tempo sono i dati. –

+0

Sei adorabile per farlo. I miei test empirici hanno dimostrato che l'utilizzo di dataUsingEncoding ha funzionato come il metodo precedente su stringhe di lunghezza moderata (200 K) e sostanzialmente peggio su stringhe di grandi dimensioni (2 M). – warrenm

0

Penso che il NSObject abbia già una funzione di hash. E NSUrl o NSString possono sovrascriverlo, puoi provare con quelle cose. Penso che nella maggior parte dei casi sia abbastanza veloce, come se inserissimo NSString in NSDictionary :) NSObject hash

+0

Come valore di ritorno ottengo un valore intero, che posso convertire in una stringa e usarlo come nome file. Tuttavia, è abbastanza "forte" da distinguere tra i molti diversi URL là fuori? Quanto è probabile che due URL diversi risultino nello stesso hash? – znq

+0

Non riesco a trovare alcun documento su google per quello :(. Ma penso che se hai un piccolo numero di URL (10 - 100, ho appena indovinato), può essere ok, ma ho scoperto che di solito le persone usano MD5 per generare l'hash, quindi le prestazioni potrebbero non essere un grosso problema con MD5 – vodkhang

+0

Grazie. Ho effettivamente controllato il tempo di esecuzione di entrambi e MD5 è praticamente lo stesso di [myObject hash] – znq