Tôi đang làm việc trên ứng dụng C Objective C Cocoa. Tôi đã thử nghiệm CC_MD5 in CommonCrypto và nó hoạt động tốt; Tuy nhiên, khi tôi đưa 5 tập tin gygabyte vào nó, toàn bộ máy tính của tôi bị đóng băng và bị rơi. Thuật toán MD5 xử lý đầu vào thành các khối 512 byte và không thực sự yêu cầu tất cả các đầu vào cùng một lúc. Có một thư viện trong mục tiêu C hoặc C yêu cầu đoạn 512 byte tiếp theo thay vì lấy tất cả các đầu vào cùng một lúc?Có thư viện MD5 nào không yêu cầu toàn bộ đầu vào cùng lúc không?
Trả lời
Có một chủ đề lớn về tính toán MD5 của tập tin lớn trong obj-C ở đây: http://www.iphonedevsdk.com/forum/iphone-sdk-development/17659-calculating-md5-hash-large-file.html
Dưới đây là giải pháp một người nào đó đã đưa ra có:
+(NSString*)fileMD5:(NSString*)path
{
NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:path];
if(handle== nil) return @"ERROR GETTING FILE MD5"; // file didnt exist
CC_MD5_CTX md5;
CC_MD5_Init(&md5);
BOOL done = NO;
while(!done)
{
NSAutoreleasePool * pool = [NSAutoreleasePool new];
NSData* fileData = [handle readDataOfLength: CHUNK_SIZE ];
CC_MD5_Update(&md5, [fileData bytes], [fileData length]);
if([fileData length] == 0) done = YES;
[pool drain];
}
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(digest, &md5);
NSString* s = [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
digest[0], digest[1],
digest[2], digest[3],
digest[4], digest[5],
digest[6], digest[7],
digest[8], digest[9],
digest[10], digest[11],
digest[12], digest[13],
digest[14], digest[15]];
return s;
}
CC_MD5()
được thiết kế để xử lý tất cả đầu vào của nó cùng một lúc. 5GB có khả năng nhiều hơn nó thực sự có thể lưu trữ bất cứ nơi nào. Đối với dữ liệu lớn hơn, CommonCrypto có thể hoạt động trên các phần của nó tại một thời điểm, nếu bạn sử dụng CC_MD5_CTX
, CC_MD5_Init()
, CC_MD5_Update()
và CC_MD5_Final()
. Kiểm tra tài liệu CommonCrypto hoặc Google để biết thêm thông tin và mã ví dụ.
Dưới đây là cách tốt hơn để thực hiện điều đó bằng cách sử dụng công cụ gửi, để có hiệu quả hơn. Tôi đang sử dụng nó trong sản xuất và nó hoạt động tốt!
#import "CalculateMD5.h"
// Cryptography
#include <CommonCrypto/CommonDigest.h>
@implementation CalculateMD5
- (id)init
{
self = [super init];
if (self)
{
MD5ChecksumOperationQueue = dispatch_queue_create("com.test.calculateMD5Checksum", DISPATCH_QUEUE_SERIAL);
}
return self;
}
- (void)closeReadChannel
{
dispatch_async(MD5ChecksumOperationQueue, ^{
dispatch_io_close(readChannel, DISPATCH_IO_STOP);
});
}
- (void)MD5Checksum:(NSString *)pathToFile TCB:(void(^)(NSString *md5, NSError *error))tcb
{
// Initialize the hash object
__block CC_MD5_CTX hashObject;
CC_MD5_Init(&hashObject);
readChannel = dispatch_io_create_with_path(DISPATCH_IO_STREAM,
pathToFile.UTF8String,
O_RDONLY, 0,
MD5ChecksumOperationQueue,
^(int error) {
[self closeReadChannel];
});
if (readChannel == nil)
{
NSError* e = [NSError errorWithDomain:@"MD5Error"
code:-999 userInfo:@{
NSLocalizedDescriptionKey : @"failed to open file for calculating MD5."
}];
tcb(nil, e);
return;
}
dispatch_io_set_high_water(readChannel, 512*1024);
dispatch_io_read(readChannel, 0, SIZE_MAX, MD5ChecksumOperationQueue, ^(bool done, dispatch_data_t data, int error) {
if (error != 0)
{
NSError* e = [NSError errorWithDomain:@"ExamSoftMD5"
code:error userInfo:@{
NSLocalizedDescriptionKey : @"failed to read from file for calculating MD5."
}];
tcb(nil, e);
[self closeReadChannel];
return;
}
if (dispatch_data_get_size(data) > 0)
{
const void *buffer = NULL;
size_t size = 0;
data = dispatch_data_create_map(data, &buffer, &size);
CC_MD5_Update(&hashObject, (const void *)buffer, (CC_LONG)size);
}
if (done == YES)
{
// Compute the hash digest
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(digest, &hashObject);
// Compute the string result
char *hash = calloc((2 * sizeof(digest) + 1), sizeof(char));
for (size_t i = 0; i < sizeof(digest); ++i)
{
snprintf(hash + (2 * i), 3, "%02x", (int)(digest[i]));
}
tcb(@(hash), nil);
[self closeReadChannel];
}
});
}
@end
- 1. Không gian thư viện lúc bắt đầu và kết thúc
- 2. Ajax nhiều yêu cầu cùng một lúc
- 3. Đối tượng Session từ chuỗi thư viện Yêu cầu của Python có an toàn không?
- 4. Máy khách HTTP liên tục có thể gửi nhiều yêu cầu cùng một lúc không?
- 5. Thư viện Trove có an toàn không?
- 6. nodejs thư viện yêu cầu, có thời gian phản ứng
- 7. Ruby: Có thể net/http thực hiện yêu cầu GET và POST cùng một lúc không?
- 8. HttpContext.Current.Items có an toàn chỉ giữa các yêu cầu không?
- 9. Ruby on Rails Nhiều yêu cầu HTTP cùng một lúc?
- 10. Có thể thực hiện yêu cầu JSONP an toàn không?
- 11. ServiceStack toàn cầu Yêu cầu Lọc Không Firing
- 12. Yêu cầu Python - Không có bộ điều hợp kết nối
- 13. Bạn có thể ghi vào luồng đầu vào và đầu ra của ổ cắm cùng một lúc không?
- 14. nsurlconnection yêu cầu không đồng bộ
- 15. nhập cùng lớp toàn cầu
- 16. Có thể nhúng Haskell vào thư viện C không?
- 17. yêu cầu không thể tìm thấy tệp .rb có cùng thư mục
- 18. Thư viện băm MD5 và SHA1 C++
- 19. cách bật yêu cầu chế độ không đồng bộ?
- 20. cách giải quyết vấn đề 'này' với các thư viện nút như không đồng bộ và yêu cầu
- 21. Chèn toàn bộ DataTable vào cơ sở dữ liệu cùng một lúc thay vì từng hàng?
- 22. Số lượng ajax đồng bộ, không đồng bộ yêu cầu
- 23. Có gói thống kê Perl không giúp tôi tải toàn bộ tập dữ liệu cùng một lúc không?
- 24. Thư viện yêu cầu: thiếu tệp sau cx_freeze
- 25. Dòng lệnh Đẩy vào Thư viện NuGet Riêng tư không thành công khi Không xử lý được yêu cầu. 'OK'
- 26. Yêu cầu đồng bộ NSURLConnection từ yêu cầu đồng bộ so với yêu cầu không đồng bộ
- 27. Làm cách nào để triển khai Bộ lọc Phản hồi HTTP để hoạt động trên toàn bộ nội dung cùng một lúc, không có chunking
- 28. yêu cầu HTTP không đồng bộ trong java
- 29. PHP yêu cầu không thành công với không có lỗi
- 30. Python yêu cầu thư viện HTTPBasicAuth với ba tham số
Cảm ơn bạn đã liên kết, đọc ngay bây giờ. –
Câu trả lời này sẽ được hưởng lợi từ bản cập nhật cho ARC. Mã trong vòng lặp cần được đặt bên trong khối '@autoreleasepool {}'. –