Вычисление хэша md5 на Objective-C

Сегодня мне нужно было внедрить md5-хэширование паролей в базе данных приложения для iPhone. Работа с базой осуществляется через уже описанную Objective-C ORM*-библиотеку*. Соответственно, и хэшировать очень хотелось какими-нибудь стандартными средствами Objective-C. Для решения поставленной задачи был произведен непродолжительный поиск в интернете, и найдено решение, которое на удивление точно подошло. На удивление – потому что когда я хотел хэшировать md5 средствами C#, то я нашел как минимум три хоть и очень похожих, но дающих разный результат методов реализации. А найденное мною решение для Objective-C выдает результат такой же, как и выбранный метод на C#, что не могло меня не обрадовать.

Вот это решение:

Файл MyExtensions.h:

@interface NSString (MyExtensions)
- (NSString *) md5;
@end

@interface NSData (MyExtensions)
- (NSString*)md5;
@end

Файл MyExtensions.m:

#import "MyExtensions.h"
#import <CommonCrypto/CommonDigest.h>  // Необходимо для доступа к CC_MD5

@implementation NSString (MyExtensions)
- (NSString *) md5
{
const char *cStr = [self UTF8String];
unsigned char result[16];
CC_MD5( cStr, strlen(cStr), result ); // This is the md5 call
return [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]
];
}
@end

@implementation NSData (MyExtensions)
- (NSString*)md5
{
unsigned char result[16];
CC_MD5( self.bytes, self.length, result ); // This is the md5 call
return [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]
];
}
@end

В нем используется возможность создания расширений для стандартных типов данных Cocoa. Благодаря этому, после подключения файла MyExtension.h, становится возможным следующий вызов:

NSString* s = @”Hash”;
NSString* hash = [s md5];

Удобно, не правда ли? Ну и, раз результат этого метода совпадает для уже описанного md5-хэширования на C#, можно понять, что после выполнения указанного кода в строке hash будет содержаться fae8a9257e154175da4193dbf6552ef6 (что по образцу предыдущего поста об md5 также вынесено в качестве картинки-иллюстрации в начале поста).

Полезная статья? Их будет больше, если вы поддержите меня!

https://money.yandex.ru/embed/small.xml?account=410011399843532&quickpay=small&yamoney-payment-type=on&button-text=06&button-size=l&button-color=orange&targets=%D0%9F%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%B2%D0%B0%D1%8E+%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82+lexpenz.com&default-sum=50&successURL=