Как получить уникальный хеш или идентификатор из URL в Какао? - PullRequest
0 голосов
/ 28 июня 2011

В моем приложении я читаю RSS-каналы и сохраняю их в базе данных Core Data, используя в качестве ключа URL-адрес каждой конкретной статьи.Передача этих URL-адресов по системе может быть проблематичной, поскольку они могут быть длительными, и я хотел бы получить способ сгенерировать уникальный идентификатор для хранения в БД и просто передать его.

Я бы также хотел, чтобы его можно было реконструировать с использованием той же строки, чтобы, если я получу повторяющийся URL-адрес, я мог сгенерировать из него идентификатор и просто проверить основные данные на наличие идентификатора.

Есть ли простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 31 августа 2011

Когда большинство людей говорят о хешах, они обычно думают об односторонних хешах, таких как SHA1, SHA2 или MD5. Хотя они очень полезны, они не позволят вам взять хеш и обратить его в первоначальный вид. Они будут , однако позволяют вам делать такие вещи, как сравнение введенного пользователем пароля с тем, который они вводили ранее, без необходимости сохранять действительный пароль - только хеш.

То, что вам нужно, это сжатие или дефляция строк. К счастью, gzip поддерживается из коробки, используя класс ASIHTTPRequest. Вот некоторый код для использования gzip, найденный в этом обсуждении .

NSString *encodedGzippedString = @"GgAAAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyK+uE6X2SJPiyZ93eaX+TI9Lcuiatvx/wOwYc0HGgAAAA==";
NSData *decodedGzippedData = [NSData dataFromBase64String:encodedGzippedString];
NSData* unGzippedJsonData = [ASIHTTPRequest uncompressZippedData:decodedGzippedData];   
NSString* unGzippedJsonString = [[NSString alloc] initWithData:unGzippedJsonData encoding:NSASCIIStringEncoding];       
NSLog(@"Result: %@", unGzippedJsonString);  

Здесь есть очень хорошая статья, в которой обсуждается хеширование с использованием MD5: http://cocoawithlove.com/2009/07/hashvalue-object-for-holding-md5-and.html

Используя библиотеку CommonCrypto, уже встроено несколько алгоритмов хэширования. Вы можете использовать алгоритм хэширования MD5, например:

#import <CommonCrypto/CommonDigest.h>

char input[] = "Some data value.";
char result[16];
CC_MD5(input, strlen(input), result);

Это напечатает хеш в читаемой человеком шестнадцатеричной форме:

printf("MD5 (\"%s\") = %02x%02x%02x%02x%02x%02x
                       %02x%02x%02x%02x%02x%02x
                       %02x%02x%02x%02x\n",
    input,
    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]);

Если вы хотите получить больше информации о хешировании только для пересылки, я разместил некоторую информацию, а также готовый код в этом SO-ответе .

0 голосов
/ 28 июня 2011

Используйте SHA1 ( его реализация в Apple на iOS ), он будет соответствовать всем вашим требованиям (повторный запуск с тем же вводом приводит к тому же выводу, изменение одного символа на входе резко меняет выход).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...