如何高效地计算IOS中NSData的哈希
以下是解决方案,希望能有所帮助。 如果您知道nsdata的大小比照片小,请使用方法1。 如果您知道nsdata的大小与某些大型文本文件的类似视频大,请使用方法2 方法1:如果您知道nsdata的大小较小如何高效地计算IOS中NSData的哈希,ios,md5,nsdata,Ios,Md5,Nsdata,以下是解决方案,希望能有所帮助。 如果您知道nsdata的大小比照片小,请使用方法1。 如果您知道nsdata的大小与某些大型文本文件的类似视频大,请使用方法2 方法1:如果您知道nsdata的大小较小 - (NSString*)MD5:(NSData *) data { // Create byte array of unsigned chars unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH];
- (NSString*)MD5:(NSData *) data
{
// Create byte array of unsigned chars
unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH];
// Create 16 byte MD5 hash value, store in buffer
CC_MD5([data bytes], (CC_LONG)data.length, md5Buffer);
// Convert unsigned char buffer to NSString of hex values
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x",md5Buffer[i]];
return output;
}
-(NSString*)MD5:(NSData*)数据
{
//创建无符号字符的字节数组
无符号字符md5Buffer[CC_MD5_DIGEST_LENGTH];
//创建16字节MD5哈希值,存储在缓冲区中
CC_MD5([数据字节],(CC_LONG)data.length,md5Buffer);
//将无符号字符缓冲区转换为十六进制值的NSString
NSMutableString*输出=[NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2];
for(int i=0;i
方法2:如果文件或资产的大小较大(例如可能大于50Mb甚至GB)
-(NSString*)MD5:(NSData*)数据
{
CC_MD5_CTX c;
CC_MD5_Init(&c);
布尔成功=否;
//使用块大小的默认值读取数据。
常量大小\u t chunkSizeForeradingData=32768;//32KB
long chunkSize=ChunkSizeForeradingData;
CFIndex readbytescont=0;
长总偏移量=0;
长数据长度=[数据长度];
NSLog(@“数据文件大小:%lu”,数据长度);
long dataTobeReadLeft=数据长度;
while(datatobereaddleft){
如果(DataToBereadLeft我认为你应该澄清和扩展你的问题。如果你的解决方案是作为一个完整的答案,请单独输入作为答案;如果它有你希望解决的缺点,请解释它们是什么,以便其他人能够提供他们的答案。分享你对这个问题的看法并不坏,但请使用correct工具:至少将其作为单独的问题和答案编写,如果这是您的意图,也可以这样做-在问题创建表单的底部有一个复选框,可以让您正确地这样做。我肯定下次会这样做,谢谢您提供的信息。
- (NSString*)MD5:(NSData *) data
{
CC_MD5_CTX c;
CC_MD5_Init(&c);
BOOL didSucceed = NO;
// Use default value for the chunk size for reading data.
const size_t chunkSizeForReadingData = 32768; // 32KB
long chunkSize=chunkSizeForReadingData;
CFIndex readBytesCount = 0;
long totalOffset=0;
long dataLength=[data length];
NSLog(@"filesize of data:%lu",dataLength);
long dataTobeReadLeft=dataLength;
while (dataTobeReadLeft) {
if (dataTobeReadLeft<chunkSize) {
uint8_t buffer[dataTobeReadLeft];
[data getBytes:buffer range:NSMakeRange(totalOffset,dataTobeReadLeft)];
readBytesCount=dataTobeReadLeft;
CC_MD5_Update(&c, buffer, (CC_LONG)dataTobeReadLeft);
dataTobeReadLeft=0;
didSucceed=YES;
}else{
uint8_t buffer[chunkSize];
[data getBytes:buffer range:NSMakeRange(totalOffset,chunkSize)];
totalOffset = totalOffset + chunkSize;
dataTobeReadLeft=dataLength-totalOffset;
CC_MD5_Update(&c, buffer, (CC_LONG)chunkSize);
}
}
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
if (didSucceed) {
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(digest, &c);
// Convert unsigned char buffer to NSString of hex values
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x",digest[i]];
}
return output;
}