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));
}