Файловая система btrfs больше не является технологическим предварительным просмотром в ядре, но столь же нетерпеливый, как я должен использовать его, я не переключаюсь сейчас. Вот то, почему я также советовал бы, чтобы не сделать это (обратите внимание, что этот ответ мог бы устареть вскоре) по приказу важности
Краткий ответ: включить предупреждения gcc (-Wall).
Длинный ответ:
NSMutableData *dataToHash = [[NSMutableData alloc] init];
[dataToHash appendData:[str dataUsingEncoding:NSUTF8StringEncoding]];
не работает: вы пытаетесь использовать строку C, где ожидается аргумент NSData. Вместо этого используйте
NSMutableData *dataToHash = [str dataUsingEncoding:NSUTF8StringEncoding];
.
Остальная часть метода берет буфер SHA1 и пытается интерпретировать эти данные как строку C UTF-8, что может привести к сбою или непредвиденному результату. Во-первых, буфер не является строкой UTF-8. Во-вторых, он не завершается нулем.
Вы хотите преобразовать SHA1 в строку с основанием 64 или аналогичную строку. Вот хороший пост о том, как это сделать.
Это то, к чему я пришел, следующим шагом было бы преобразовать его в категорию NSString вместо статического метода во вспомогательном классе:
+(NSString *)stringToSha1:(NSString *)str{
const char *s = [str cStringUsingEncoding:NSASCIIStringEncoding];
NSData *keyData = [NSData dataWithBytes:s length:strlen(s)];
// This is the destination
uint8_t digest[CC_SHA1_DIGEST_LENGTH] = {0};
// This one function does an unkeyed SHA1 hash of your hash data
CC_SHA1(keyData.bytes, keyData.length, digest);
// Now convert to NSData structure to make it usable again
NSData *out = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
// description converts to hex but puts <> around it and spaces every 4 bytes
NSString *hash = [out description];
hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
NSLog(@"Hash is %@ for string %@", hash, str);
return hash;
}
Моя версия функции SHA1 (проще):
- (NSString *)sha1:(NSString *)str {
const char *cStr = [str UTF8String];
unsigned char result[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(cStr, strlen(cStr), result);
NSString *s = [NSString stringWithFormat:
@"%02x%02x%02x%02x%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],
result[16], result[17], result[18], result[19]
];
return s;
}
И MD5:
- (NSString *)md5:(NSString *)str {
const char *cStr = [str UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr, strlen(cStr), result);
NSString *s = [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]
];
return s;
}