Я выполняю работу по загрузке файлов. Я хочу сгенерировать хэши SHA256 и CRC32. Может ли кто-нибудь помочь мне, как мне сгенерировать этот хэш? Я хочу, чтобы это работало для iOS.
Как сгенерировать SHA256 и CRC32 в iOS
Ответы (4)
SHA256 доступен в CommonCrypto. CRC32 — это не хэш, это проверка циклическим избыточным кодом.
Пример кода:
#import <CommonCrypto/CommonDigest.h>
NSData *dataIn = [@"Now is the time for all good computers to come to the aid of their masters." dataUsingEncoding:NSASCIIStringEncoding];
NSMutableData *macOut = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];
CC_SHA256(dataIn.bytes, dataIn.length, macOut.mutableBytes);
NSLog(@"dataIn: %@", dataIn);
NSLog(@"macOut: %@", macOut);
NSLog output:
dataIn: ‹4e6f7720 69732074 68652074 696d6520 666f7220 616c6c20 676f6f64 20636f6d 70757465 72732074 6f20636f 6d652074 6f207468 65206169 64206f66 20746865 6972206d 61737465 72732e>
macOut: ‹53f89cf6 7ebfbe56 89f1f76a 3843dfd1 09d68c5b a938dcd2 9a12004e 108260cb>
CC_SHA256
вычисляет хэш данных, а не строки. Если вы получаете другое значение, вы каким-то образом предоставляете другой ввод. Каким сайтом вы пользовались?
- person zaph; 29.02.2012
dataIn.length
предоставляет длину данных, не имеет значения, как были созданы NSData
. Также strlen()
ожидает строку с завершающим нулем, которая не гарантируется и не присутствует в этом примере. Я согласен с тем, что интернационализация важна, но не имеет отношения к вопросу/ответу.
- person zaph; 12.12.2012
CommonCrypto
, убедитесь, что вы добавили iOS Security.framework
в свой проект.
- person Dimitris; 16.12.2017
Для обоих из них вы можете использовать этот смысл:
https://gist.github.com/paul-delange/6808278
И пример
NSString* crc32 = (__bridge NSString*)TGDFileHashCreateWithPath((__bridge CFStringRef)filepath, TGDFileHashDefaultChunkSizeForReadingData, TGDChecksumAlgorithmCRC32);
Этот метод будет генерировать crc32c, используемый gcloud на iOS, из пути к файлу. Если вам нужен стандартный crc32, просто раскомментируйте другое значение CRC32_POLYNOMIAL.
Он читает файл, заданный кусками по 512 КБ, поэтому его можно использовать для больших файлов.
- (NSString*) crc32c:(NSString*)filepath{
/// using crc code from
// http://classroomm.com/objective-c/index.php?action=printpage;topic=2891.0
// by rgronlie
//this is the standard crc32 polynomial
//uint32_t CRC32_POLYNOMIAL = 0xEDB88320;
//this is the crc32c one
uint32_t CRC32_POLYNOMIAL = 0x82F63B78L;
uint32_t CRC32C_SEED = 0xFFFFFFFFL;
// create and populate a lookup table
uint32_t* pCRCTable = malloc(sizeof(uint32_t) * 256);
for (uint32_t i = 0; i <= 255; i++)
{
uint32_t crc32 = i;
for (uint32_t j = 8; j > 0; j--)
{
if ((crc32 & 1) == 1)
crc32 = (crc32 >> 1) ^ CRC32_POLYNOMIAL;
else
crc32 >>= 1;
}
pCRCTable[i] = crc32;
}
// get a handle to the file
NSFileHandle *filehandle = [NSFileHandle fileHandleForReadingAtPath:filepath];
if(filehandle == NULL){
NSLog(@"failed to create file handle");
return nil;
}
// a buffer to read into
NSData* databuffer;
uint32_t crc = CRC32C_SEED;
// read the file in chunks of 512KB
while(true){
databuffer = [filehandle readDataOfLength: 512 * 1024];
// if there is nothing left finish
if([databuffer length] == 0){
break;
}
// otherwise run each chunk through the lookup table
uint8_t *pBytes = (uint8_t *)[databuffer bytes];
uint32_t length = [databuffer length];
while (length--)
{
crc = (crc>>8) ^ pCRCTable[(crc & 0xFF) ^ *pBytes++];
}
}
// clean up
[filehandle closeFile];
free(pCRCTable);
// this is the result
uint32_t hash = crc ^ 0xFFFFFFFFL;
// reverse it for endianness
uint32_t hash_reversed = CFSwapInt32HostToBig(hash);
// as raw bytes
NSData* hash_data = [NSData dataWithBytes: &hash_reversed length: sizeof(hash_reversed)];
// return base64 encoded
return [hash_data base64EncodedStringWithOptions:0];
}
нет приложений, которые могут генерировать хеш для ios
Это должно работать .... для Mac
http://itunes.apple.com/us/app/digiprint/id473233587?mt=12