17

iPhone SDK を使用して、ユーザーに画像ピッカーから画像を選択させています。ユーザーが以前に選択した画像を選択した場合は、ユーザーにそれを認識させたいと思います。

私の最初の計画 (今のところ他のことが機能することを確認するため) は、NSData のチェックサムをファイル名として使用して、イメージをファイルに保存することです (他の理由でとにかくこれを行う必要があります)。次に、後で同じ画像を選択すると、チェックサムが同じになるため、その名前のファイルが既に存在することがわかります。

ただし、NSData からチェックサムを計算する方法については、インターネットと Apple ドキュメントを精査しました。独自の実装を実装できることはわかっていますが、可能であればそれを避けたいと思います。2 つの UIImage が同じであることを確認する方法の他のアイデアにも満足しています。

編集

2 年前、私はコード サンプルを提供することを約束しました。遅くなって本当にごめんなさい!:)

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

2 に答える 2

25

カテゴリを使用するとすべてが優れているため...

ヘッダ:

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

実装:

#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;
}
于 2011-01-25T19:00:08.053 に答える
11

ヘッダー ファイルには、<CommonCrypto/CommonDigest.h>任意のデータの MD5 ハッシュを計算する CC_MD5 関数が必要です。これは C 関数なので、NSData では直接動作しませんが、必要なことは行う必要があります。

ここにいくつかの詳細情報があります(NSString を使用するラッパーを含む - NSData を使用するように変換するのは簡単なはずです)

于 2009-06-22T18:42:12.300 に答える