Как делают меня sha1 строка или набор чисел в Цели c?
В CommonCrypto (фреймворк Apple) есть функции для вычисления SHA-1 хэшей, включая одношаговый хэш:
#include <CommonCrypto/CommonDigest.h>
unsigned char digest[CC_SHA1_DIGEST_LENGTH];
NSData *stringBytes = [someString dataUsingEncoding: NSUTF8StringEncoding]; /* or some other encoding */
if (CC_SHA1([stringBytes bytes], [stringBytes length], digest)) {
/* SHA-1 hash has been calculated and stored in 'digest'. */
...
}
Для набора чисел, предположим, имеется в виду массив целых чисел известной длины. Для таких данных проще итеративно построить дайджест, чем использовать одношаговую функцию:
unsigned char digest[CC_SHA1_DIGEST_LENGTH];
uint32_t *someIntegers = ...;
size_t numIntegers = ...;
CC_SHA1_CTX ctx;
CC_SHA1_Init(&ctx);
{
for (size_t i = 0; i < numIntegers; i++)
CC_SHA1_Update(&ctx, someIntegers + i, sizeof(uint32_t));
}
CC_SHA1_Final(digest, &ctx);
/* SHA-1 hash has been calculated and stored in 'digest'. */
...
Обратите внимание, что здесь не учитывается эндианальность. SHA-1, вычисленный с помощью этого кода на системе PowerPC, будет отличаться от вычисленного на системе i386 или ARM. Решение простое - поменяйте байты целых чисел на известную эндианальность перед вычислением:
for (size_t i = 0; i < numIntegers; i++) {
uint32_t swapped = CFSwapInt32HostToLittle(someIntegers[i]); /* or HostToBig */
CC_SHA1_Update(&ctx, &swapped, sizeof(swapped));
}
SHA1 фактически не поставляется с Objective-C. Вы можете использовать исходный код C для hashdeep
и его друзей, который находится под лицензией в общественном достоянии (потому что он был написан сотрудником правительства США): http: //md5deep.sourceforge .net / .