Pergunta

Usando o iPhone SDK, estou tendo as imagens selecionadas de usuário do seletor de imagem. Se o usuário selecionar uma imagem que você selecionou antes, eu gostaria de fazer o usuário consciente disso.

Meu plano inicial (apenas para certificar-se de outra as coisas funcionam por agora) é para salvar a imagem em um arquivo (necessidade de fazer isso de qualquer maneira por outras razões), usando uma soma de verificação do NSData como o nome do arquivo. Então, quando eles selecionam a mesma imagem mais tarde, a soma de verificação será o mesmo e assim eu posso ver que um arquivo com esse nome já existe - hurray

No entanto, eu percorri a internet e os docs da Apple para saber como calcular uma soma de verificação a partir de uma NSData. Eu sei que eu poderia implementar a minha própria implementação, mas eu prefiro para evitar que, se possível. Eu também estou feliz por outras idéias de como verificar que dois UIImages são os mesmos.

Editar

Dois anos atrás eu prometi um exemplo de código, e aqui está ele. Realmente sinto muito pelo atraso! :)

+(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;
}
Foi útil?

Solução

No arquivo de cabeçalho <CommonCrypto/CommonDigest.h> deve haver uma função CC_MD5 que irá calcular um hash MD5 dos dados arbitrária. É uma função C, por isso não vai trabalhar diretamente em um NSData, mas deve fazer o que você precisa.

Alguns informações mais aqui (incluindo um invólucro usando NSString - deve ser fácil o suficiente para converter a usar NSData)

Outras dicas

Porque tudo é melhor com categorias ...

Cabeçalho:

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

Implementação:

#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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top