2009-06-22 7 views
17

En utilisant le SDK iPhone, l'utilisateur sélectionne des images dans le sélecteur d'image. Si l'utilisateur sélectionne une image qu'il a déjà sélectionnée, j'aimerais en informer l'utilisateur. Mon plan initial (juste pour s'assurer que d'autres choses fonctionnent pour l'instant) est de sauvegarder l'image dans un fichier (besoin de le faire quand même pour d'autres raisons), en utilisant une somme de contrôle du NSData comme nom de fichier. Ensuite, quand ils sélectionneront la même image plus tard, la somme de contrôle sera la même et ainsi je peux voir qu'un fichier avec ce nom existe déjà - hourra!Calculer une somme de contrôle sur l'iPhone à partir de NSData

Cependant, j'ai parcouru Internet et les docs Apple pour savoir comment calculer une somme de contrôle à partir d'un 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 heureux pour d'autres idées sur la façon de vérifier que deux UIImages sont les mêmes.

EDIT

Il y a deux ans je lui ai promis un exemple de code, et ici il est. 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; 
} 
+0

"MD5Sum" n'est pas une méthode déclarée sur NSData. Cet exemple de code ne fonctionne pas. : P –

Répondre

11

Dans le fichier d'en-tête <CommonCrypto/CommonDigest.h> il devrait y avoir une fonction CC_MD5 qui calcule un hachage MD5 des données arbitraires. C'est une fonction C, donc cela ne fonctionnera pas directement sur un NSData, mais il devrait faire ce dont vous avez besoin.

Un peu plus info here (y compris un emballage en utilisant NSString - devrait être assez facile de se convertir à utiliser NSData)

+1

Excellent. Une fois que je rentre à la maison et que je suis capable de le faire sur NSData, je vais poster ici avec un échantillon de code. Merci! – Itay

+5

oups .. doit avoir oublié de retourner à poster des échantillons promis. –

+2

Michael Morrison - vous m'a appelé sur le sujet. Fixe, deux ans plus tard :) – Itay

24

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

tête:

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

Implémentation:

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

Fonctionne comme un charme! –

+3

Cette méthode peut éviter une copie de mémoire supplémentaire en faisant: CC_MD5 ([self bytes], (unsigned int) [self length], resultCString); ... au lieu de malloc (...)/[getBytes: ...]/CC_MD5 (...)/free (...) – numist

Questions connexes