Domanda

Utilizzando l'SDK di iPhone, sto facendo in modo che l'utente selezioni le immagini dal selettore immagini. Se l'utente seleziona un'immagine che ha selezionato in precedenza, vorrei renderne consapevole l'utente.

Il mio piano iniziale (solo per assicurarmi che le altre cose funzionino per ora) è di salvare l'immagine in un file (è necessario farlo comunque per altri motivi), usando un checksum di NSData come nome del file. Quindi, quando selezioneranno la stessa immagine in seguito, il checksum sarà lo stesso e quindi posso vedere che esiste già un file con quel nome - evviva!

Tuttavia, ho cercato su Internet e sui documenti Apple come calcolare un checksum da un NSData. So che potrei implementare la mia implementazione, ma preferirei evitarlo, se possibile. Sono anche felice per altre idee su come verificare che due UIImages siano uguali.

Modifica

Due anni fa ho promesso un esempio di codice, ed eccolo qui. Mi dispiace davvero per il ritardo! :)

+(NSString*)imageIdForData:(NSData*)data
{
        char* result = (char*) [[data MD5Sum] bytes];

        NSString* hash =  [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]];

        return hash;
}
È stato utile?

Soluzione

Nel file di intestazione <CommonCrypto/CommonDigest.h> dovrebbe esserci una funzione CC_MD5 che calcolerà un hash MD5 di dati arbitrari. È una funzione C, quindi non funzionerà direttamente su un NSData, ma dovrebbe fare ciò di cui hai bisogno.

Alcuni altri informazioni qui (incluso un wrapper usando NSString - dovrebbe essere abbastanza facile da convertire per usare NSData)

Altri suggerimenti

Perché tutto è meglio con le categorie ...

intestazione:

@interface NSData (MD5)
- (NSString *)md5String;
@end

Implementazione:

#import <CommonCrypto/CommonDigest.h>


- (NSString *)md5String
{
    void *cData = malloc([self length]);
    unsigned char resultCString[16];
    [self getBytes:cData length:[self length]];

    CC_MD5(cData, (unsigned int)[self length], resultCString);
    free(cData);

    NSString *result = [NSString stringWithFormat:
                        @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
                        resultCString[0], resultCString[1], resultCString[2], resultCString[3],
                        resultCString[4], resultCString[5], resultCString[6], resultCString[7],
                        resultCString[8], resultCString[9], resultCString[10], resultCString[11],
                        resultCString[12], resultCString[13], resultCString[14], resultCString[15]
                        ];
    return result;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top