计算 MD5值

//
//  MD5Value.h
//  iOSEdu
//
//  Created by littest on 16/2/26.
//  Copyright © 2016年 littest. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonDigest.h>
#define FileHashDefaultChunkSizeForReadingData 1024*8 // 8K
@interface MD5Value : NSObject
// 计算 NSData 的 MD5 值

+(NSString*)getMD5WithData:(NSData*)data;

// 计算字符串的 MD5 值,

+(NSString*)getmd5WithString:(NSString*)string;

// 计算大文件的 MD5 值

+(NSString*)getFileMD5WithPath:(NSString*)path;
@end
//
//  MD5Value.m
//  iOSEdu
//
//  Created by littest on 16/2/26.
//  Copyright © 2016年 littest. All rights reserved.
//

#import "MD5Value.h"

@implementation MD5Value
+ (NSString*)getmd5WithString:(NSString *)string

{

    const char* original_str=[string UTF8String];

    unsigned char digist[CC_MD5_DIGEST_LENGTH]; //CC_MD5_DIGEST_LENGTH = 16

    CC_MD5(original_str, strlen(original_str), digist);

    NSMutableString* outPutStr = [NSMutableString stringWithCapacity:10];

    for(int  i =0; i<CC_MD5_DIGEST_LENGTH;i++){

        [outPutStr appendFormat:@"%02x", digist[i]];// 小写 x 表示输出的是小写 MD5 ,大写 X 表示输出的是大写 MD5

    }

    return [outPutStr lowercaseString];

}

+ (NSString*)getMD5WithData:(NSData *)data{

    const char* original_str = (const char *)[data bytes];

    unsigned char digist[CC_MD5_DIGEST_LENGTH]; //CC_MD5_DIGEST_LENGTH = 16

    CC_MD5(original_str, strlen(original_str), digist);

    NSMutableString* outPutStr = [NSMutableString stringWithCapacity:10];

    for(int  i =0; i<CC_MD5_DIGEST_LENGTH;i++){

        [outPutStr appendFormat:@"%02x",digist[i]];// 小写 x 表示输出的是小写 MD5 ,大写 X 表示输出的是大写 MD5

    }

    // 也可以定义一个字节数组来接收计算得到的 MD5 值

    //    Byte byte[16];

    //    CC_MD5(original_str, strlen(original_str), byte);

    //    NSMutableString* outPutStr = [NSMutableString stringWithCapacity:10];

    //    for(int  i = 0; i<CC_MD5_DIGEST_LENGTH;i++){

    //        [outPutStr appendFormat:@"%02x",byte[i]];

    //    }

    //    [temp release];

    return [outPutStr lowercaseString];

}

+(NSString*)getFileMD5WithPath:(NSString*)path

{

    return (__bridge  NSString *)FileMD5HashCreateWithPath((__bridge CFStringRef)path,FileHashDefaultChunkSizeForReadingData);

}

CFStringRef FileMD5HashCreateWithPath(CFStringRef filePath,

                                      size_t chunkSizeForReadingData) {

    // Declare needed variables

    CFStringRef result = NULL;

    CFReadStreamRef readStream = NULL;

    // Get the file URL

    CFURLRef fileURL =

    CFURLCreateWithFileSystemPath(kCFAllocatorDefault,

                                  (CFStringRef)filePath,

                                  kCFURLPOSIXPathStyle,

                                  (Boolean)false);

    CC_MD5_CTX hashObject;

    bool hasMoreData = true;

    bool didSucceed;

    if (!fileURL) goto done;

    // Create and open the read stream

    readStream = CFReadStreamCreateWithFile(kCFAllocatorDefault,

                                            (CFURLRef)fileURL);

    if (!readStream) goto done;

    didSucceed = (bool)CFReadStreamOpen(readStream);

    if (!didSucceed) goto done;

    // Initialize the hash object

    CC_MD5_Init(&hashObject);

    // Make sure chunkSizeForReadingData is valid

    if (!chunkSizeForReadingData) {

        chunkSizeForReadingData = FileHashDefaultChunkSizeForReadingData;

    }

    // Feed the data to the hash object

    while (hasMoreData) {

        uint8_t buffer[chunkSizeForReadingData];

        CFIndex readBytesCount = CFReadStreamRead(readStream,

                                                  (UInt8 *)buffer,

                                                  (CFIndex)sizeof(buffer));

        if (readBytesCount == -1)break;

        if (readBytesCount == 0) {

            hasMoreData =false;

            continue;

        }

        CC_MD5_Update(&hashObject,(const void *)buffer,(CC_LONG)readBytesCount);

    }

    // Check if the read operation succeeded

    didSucceed = !hasMoreData;

    // Compute the hash digest

    unsigned char digest[CC_MD5_DIGEST_LENGTH];

    CC_MD5_Final(digest, &hashObject);

    // Abort if the read operation failed

    if (!didSucceed) goto done;

    // Compute the string result

    char hash[2 *sizeof(digest) + 1];

    for (size_t i =0; i < sizeof(digest); ++i) {

        snprintf(hash + (2 * i),3, "%02x", (int)(digest[i]));

    }

    result = CFStringCreateWithCString(kCFAllocatorDefault,

                                       (const char *)hash,

                                       kCFStringEncodingUTF8);

done:

    if (readStream) {

        CFReadStreamClose(readStream);

        CFRelease(readStream);

    }

    if (fileURL) {

        CFRelease(fileURL);

    }

    return result;

}
@end
时间: 2024-10-07 06:57:59

计算 MD5值的相关文章

Python两种方法计算MD5值

1.Python内置md5模块 1 #-*- coding:utf-8 -*- 2 3 import md5 4 5 def Str2Md5(s): 6 m=md5.new() 7 m.update(s) 8 return m.hexdigest() 9 10 if __name__=="__main__": 11 s="www.baidu.com" 12 print Str2Md5(s) 2.Python的hashlib模块 1 #-*- coding:utf-8

java计算MD5值

package com.linusiyu.common; import java.io.File; import java.io.FileInputStream; import java.math.BigInteger; import java.security.MessageDigest; public class MD5Util { public static String MD5(String content){ byte[] result = new byte[]{}; try { Me

python计算文件的md5值

前言 最近要开发一个基于python的合并文件夹/目录的程序,本来的想法是基于修改时间的比较,即判断文件有没有改变,比较两个文件的修改时间即可.这个想法在windows的pc端下测试没有问题. 但是当把一个文件从pc端复制到优盘时出现了一个问题,复制到优盘的文件比pc端的文件慢了两秒钟! 这里我用的复制函数是 shutil.copy2(),理论上它会把修改时间和最后访问时间也复制过来1,但是实际情况并不是完全相同. 详细情况我在segmentfault里提出了问题:为什么将一个文件从pc中复制到

H5计算图片视频资源md5值(使用fileapi)

2017/10/28 发布 md5概念及作用: MD5是message-digest algorithm 5(信息-摘要算法)的缩写,被广泛用于加密和解密技术上,它可以说是文件的"数字指纹".任何一个文件,无论是可执行程序.图像文件.临时文件或者其他任何类型的文件,也不管它体积多大,都有且只有一个独一无二的MD5信息值,并且如果这个文件被修改过,它的MD5值也将随之改变.因此,我们可以通过对比同一文件的MD5值,来校验这个文件是否被"篡改"过. 实际应用: 近期在开

【Unity3D】使用MD5值,确保本地Sqlite数据库内容没有被篡改

Sqlite的应用场景 在判断是否使用存储格式为Sqlite模式的标准,我们的标准是内容只读.也就是说,除非发布者修改Sqlite内容,玩家只有读取的权限. 换个角度说,Sqlite里面的数据都是游戏基础配置数据,比如游戏的关卡(不包括玩家取得的成就).怪物的血量.装备的模板数据 对于如何使用Sqlite,请参考我的另外一篇文章<Unity本地数据存储---Sqlite和JSON> 问题重现 OK,既然我们选择了Sqlite作为存储手段之一,那么我们也嘚重视起安全性. 以android而言,我

C#对文件进行MD5值检测

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.ComponentModel; 7 using System.Data; 8 using System.Drawing; 9 using System.IO; 10 using System.Security.Cryp

node快速计算md5

最近在做一个文件上传的项目,当上传文件达到几十GB,几百GB后在文件上传99%后,需要等待非常长的时间文件才能完成上传.通过埋点打印时间,发现md5计算时间非常长. 为了校验文件传输的完整性需要在文件上传结束后校验文件的完整性,md5值就用来校验完整性,所以这一步不能少. 解决方案 通过网上查找资料,MD5计算工具在计算大文件md5值时也不是一次性计算出来的,也是通过分片的方式累加计算出来的. 所以我们在上传大文件时,本来上传的思路就是分片上传,我们只需要对每块分片进行md5计算,最后累加计算m

计算目录下的md5值,用于文件被篡改后对比

计算/etc目录下的md5值,用于文件被篡改后对比,命令如下: find /etc/ -maxdepth 1 -type f | xargs -n1 md5sum> /root/etc_sum-$(date +%F).log 同样的道理, 我们可以将/usr/bin  /usr/sbin/ /usr/local/bin /root/bin 等等重要的目录下面的文件校验和都计算一遍,这样的话定期执行一下该命令,生成一份最新的校验和,通过diff命令将生成的log文件和原始的md5sum.log比较

用Python计算文件的MD5值

尽管计算MD5有很多小工具,重装系统后还得去找,就自己用Python写了一个: getMD5.py import hashlib import sys if __name__ == '__main__': if len(sys.argv)!= 2: sys.exit('argv error!') m = hashlib.md5() n = 1024*4 inp = open(sys.argv[1],'rb') while True: buf = inp.read(n) if buf: m.upd