17 votes

Calculer une somme de contrôle sur l'iPhone à partir de NSData

En utilisant le SDK de l'iPhone, je demande à l'utilisateur de sélectionner des images dans le sélecteur d'images. Si l'utilisateur sélectionne une image qu'il a déjà sélectionnée auparavant, j'aimerais qu'il le sache.

Mon plan initial (juste pour m'assurer que d'autres choses fonctionnent pour l'instant) est d'enregistrer l'image dans un fichier (je dois le faire de toute façon pour d'autres raisons), en utilisant une somme de contrôle des NSData comme nom de fichier. Ensuite, lorsqu'ils sélectionneront la même image plus tard, la somme de contrôle sera la même et je pourrai donc voir qu'un fichier portant ce nom existe déjà - hourra !

Cependant, j'ai parcouru l'Internet et la documentation d'Apple pour savoir comment calculer une somme de contrôle à partir d'une NSData. Je sais que je pourrais mettre en œuvre ma propre implémentation, mais je préférerais éviter cela, si possible. Je suis également ouvert à d'autres idées sur la façon de vérifier que deux UIImages sont identiques.

EDIT

Il y a deux ans, j'ai promis un exemple de code, et le voici. Vraiment désolé pour le retard ! :)

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

25voto

BadPirate Points 11614

Parce que tout est mieux avec des catégories...

En-tête :

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

Mise en œuvre :

#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;
}

11voto

Eric Petroelje Points 40734

En el <CommonCrypto/CommonDigest.h> il devrait y avoir une fonction CC_MD5 qui calculera un hachage MD5 de données arbitraires. Comme il s'agit d'une fonction C, elle ne fonctionnera pas directement sur une NSData, mais elle devrait répondre à vos besoins.

Un peu plus info ici (y compris un wrapper utilisant NSString - qui devrait être assez facile à convertir pour utiliser NSData)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X