Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何高效地计算IOS中NSData的哈希_Ios_Md5_Nsdata - Fatal编程技术网

如何高效地计算IOS中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];

以下是解决方案,希望能有所帮助。 如果您知道nsdata的大小比照片小,请使用方法1。 如果您知道nsdata的大小与某些大型文本文件的类似视频大,请使用方法2

方法1:如果您知道nsdata的大小较小

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