精华内容
下载资源
问答
  • 计算字符串的MD5值和MD5文件摘要

    千次阅读 2017-01-19 15:09:21
    md5.h #ifndef __MD5_INCLUDED__ ...//MD5摘要值结构体 typedef struct MD5VAL_STRUCT { unsigned int a; unsigned int b; unsigned int c; unsigned int d; } MD5VAL; //计算字符串的MD5值(若不

    md5.h


    #ifndef __MD5_INCLUDED__
    #define __MD5_INCLUDED__
    
    
    //MD5摘要值结构体
    typedef struct MD5VAL_STRUCT
    {
    	unsigned int a;
    	unsigned int b;
    	unsigned int c;
    	unsigned int d;
    } MD5VAL;
    
    //计算字符串的MD5值(若不指定长度则由函数计算)
    MD5VAL md5(char * str, unsigned int size=0);
    
    //MD5文件摘要
    MD5VAL md5File(FILE * fpin);
    
    #endif
    







    Md5.cpp

    
    
    //DEFINES for MD5
    
    #define UINT4 unsigned int
    
    
    /* F, G, H and I are basic MD5 functions. */
    #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
    #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
    #define H(x, y, z) ((x) ^ (y) ^ (z))
    #define I(x, y, z) ((y) ^ ((x) | (~z)))
    
    /* ROTATE_LEFT rotates x left n bits. */
    #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
    
    /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
    Rotation is separate from addition to prevent recomputation. */
    #define FF(a, b, c, d, x, s, ac) { \
     (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
     (a) = ROTATE_LEFT ((a), (s)); \
     (a) += (b); \
      }
    #define GG(a, b, c, d, x, s, ac) { \
     (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
     (a) = ROTATE_LEFT ((a), (s)); \
     (a) += (b); \
      }
    #define HH(a, b, c, d, x, s, ac) { \
     (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
     (a) = ROTATE_LEFT ((a), (s)); \
     (a) += (b); \
      }
    #define II(a, b, c, d, x, s, ac) { \
     (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
     (a) = ROTATE_LEFT ((a), (s)); \
     (a) += (b); \
      }
    
    // Constants for MD5 Transform routine.
    #define S11 7
    #define S12 12
    #define S13 17
    #define S14 22
    #define S21 5
    #define S22 9
    #define S23 14
    #define S24 20
    #define S31 4
    #define S32 11
    #define S33 16
    #define S34 23
    #define S41 6
    #define S42 10
    #define S43 15
    #define S44 21
    
    //===============
    
    #include <stdio.h>
    #include <string.h>
    #include "md5.h"
    
    
    
    //MD5摘要
    MD5VAL md5(char * str, unsigned int size)
    {
    	if(size==0)
    		size=strlen(str);
    	unsigned int m=size%64;
    	unsigned int lm=size-m;  //数据整块长度
    	unsigned int ln;  //数据补位后长度
    	if(m<56)
    		ln=lm+64;
    	else
    		ln=lm+128;
    	char * strw=new char[ln];
    	unsigned int i;
    	//复制原字串到缓冲区strw
    	for(i=0;i<size;i++)
    		strw[i]=str[i];
    	//补位
    	strw[i++]=(char)0x80;
    	for(i;i<ln-8;i++)
    		strw[i]=0x00;
    	//补长度
    	unsigned int * x=(unsigned int *)(strw+i);
    	*(x++)=size<<3;
    	*(x++)=size>>29;
    	//初始化MD5参数
    	MD5VAL val={0x67452301,0xefcdab89,0x98badcfe,0x10325476};
    	unsigned int &a=val.a, &b=val.b, &c=val.c, &d=val.d;
    	unsigned int aa,bb,cc,dd;
    	for(i=0;i<ln;i+=64)
    	{
    		x=(unsigned int *)(strw+i);
    		// Save the values
    		aa=a; bb=b; cc=c; dd=d;
    		// Round 1
    		FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
    		FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
    		FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
    		FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
    		FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
    		FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
    		FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
    		FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
    		FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
    		FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
    		FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
    		FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
    		FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
    		FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
    		FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
    		FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
    		// Round 2
    		GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
    		GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
    		GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
    		GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
    		GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
    		GG (d, a, b, c, x[10], S22,  0x2441453); /* 22 */
    		GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
    		GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
    		GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
    		GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
    		GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
    		GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
    		GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
    		GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
    		GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
    		GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
    		// Round 3
    		HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
    		HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
    		HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
    		HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
    		HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
    		HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
    		HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
    		HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
    		HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
    		HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
    		HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
    		HH (b, c, d, a, x[ 6], S34,  0x4881d05); /* 44 */
    		HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
    		HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
    		HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
    		HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
    		// Round 4 */
    		II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
    		II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
    		II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
    		II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
    		II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
    		II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
    		II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
    		II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
    		II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
    		II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
    		II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
    		II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
    		II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
    		II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
    		II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
    		II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
    		// Add the original values
    		a+=aa;
    		b+=bb;
    		c+=cc;
    		d+=dd;
    	}
    	delete[] strw;
    	return val;
    }
    
    #define BUFFER_SIZE 4096   //必须是64的倍数
    static char * Buffer=NULL;
    //MD5文件摘要
    MD5VAL md5File(FILE * fpin)
    {
    	if(!Buffer)
    		Buffer=new char[BUFFER_SIZE+64];
    	char * buf=Buffer;
    	MD5VAL val={0x67452301,0xefcdab89,0x98badcfe,0x10325476};
    	unsigned int &a=val.a, &b=val.b, &c=val.c, &d=val.d;
    	unsigned int aa,bb,cc,dd;
    	unsigned int i,j,count,co;
    	unsigned int * x;
    	i=0;
    	do
    	{
    		count=fread(buf,1,BUFFER_SIZE,fpin);
    		i+=count;
    		if(count==BUFFER_SIZE)
    			co=BUFFER_SIZE;
    		else
    		{
    			j=count;
    			buf[j++]=(char)0x80;
    			for(j;j%64!=56;j++)
    				buf[j]=0x00;
    			*(unsigned int *)(buf+j)=i<<3; j+=4;
    			*(unsigned int *)(buf+j)=i>>29; j+=4;
    			co=j;
    		}
    		for(j=0;j<co;j+=64)
    		{
    			x=(unsigned int *)(buf+j);
    			// Save the values
    			aa=a; bb=b; cc=c; dd=d;
    			// Round 1
    			FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
    			FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
    			FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
    			FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
    			FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
    			FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
    			FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
    			FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
    			FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
    			FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
    			FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
    			FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
    			FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
    			FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
    			FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
    			FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
    			// Round 2
    			GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
    			GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
    			GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
    			GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
    			GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
    			GG (d, a, b, c, x[10], S22,  0x2441453); /* 22 */
    			GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
    			GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
    			GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
    			GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
    			GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
    			GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
    			GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
    			GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
    			GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
    			GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
    			// Round 3
    			HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
    			HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
    			HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
    			HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
    			HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
    			HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
    			HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
    			HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
    			HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
    			HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
    			HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
    			HH (b, c, d, a, x[ 6], S34,  0x4881d05); /* 44 */
    			HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
    			HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
    			HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
    			HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
    			// Round 4 */
    			II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
    			II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
    			II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
    			II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
    			II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
    			II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
    			II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
    			II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
    			II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
    			II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
    			II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
    			II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
    			II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
    			II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
    			II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
    			II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
    			// Add the original values
    			a+=aa;
    			b+=bb;
    			c+=cc;
    			d+=dd;
    		}
    
    	} while(count==BUFFER_SIZE);
    	return val;
    }
    
    


    展开全文
  • VC++ 文件MD5摘要

    2010-11-23 11:28:13
    VC++ 文件MD5摘要 VC++ 文件MD5摘要 测试能过
  • 基于多层MD5消息摘要文件完整性实时检测技术.pdf
  • SHA1或MD5算法获取文件摘要值(JAVA)

    热门讨论 2013-07-31 15:49:05
    SHA1或MD5算法获取文件摘要值(JAVA)
  • 文件夹包含arm-linux md5 摘要文件静态库以及pc-linux md5 摘要文件静态库和windows vc6.0md5 摘要文件静态库。这几个静态库方便实用。只要输入文件路径就可以得到文件MD5摘要。适合需要传输文件并校验文件的完整...
  • 本篇文章主要介绍了Java实现MD5消息摘要算法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 自制的便利工具,用于校验文件,支持计算MD5、SHA1、SHA256、SHA512,支持拖放、添加到右键菜单、命令行调用。
  • 网上说的都是2md5看是否一样,我想知道的问题如下: 1.第一次的md5哪里来的?别人不能篡改这个md5吗? 2.第二次的md5又到底是对什么md5? 3.这个md5校验是和文件完全分开的2个步骤是吗?
  • iOS对大文件MD5摘要性能测试

    千次阅读 2016-11-07 21:14:35
    最近接到了一个需求,里面需要对文件进行md5摘要.从网上搜索到了两个还可以的代码片段,为了更好的判断该使用哪个,这里对这两种摘要方式做了时间和内存的测试.一 测试环境1.四种大小的文件:1m,10,20m,30m 3.工具:xcode...

    最近接到了一个需求,里面需要对文件进行md5摘要.从网上搜索到了两个还可以的代码片段,为了更好的判断该使用哪个,这里对这两种摘要方式做了时间和内存的测试.

    一 测试环境

    1.四种大小的文件:1m,10,20m,30m
    3.工具:xcode8
    4.设备:iphone4s,ios8;iphone5,ios10;iphone6,ios9;iphone6s,ios10
    

    二. 两种方法代码

    使用filehandle

    + (NSString *)md5WithFilePath:(NSString *)path {
    
        NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:path];
        if( handle== nil ) {
            return nil;
        }
        CC_MD5_CTX md5;
        CC_MD5_Init(&md5);
        BOOL done = NO;
        while(!done)
        {
            NSData* fileData = [handle readDataOfLength: 256 ];
            CC_MD5_Update(&md5, [fileData bytes], (CC_LONG)[fileData length]);
            if( [fileData length] == 0 ) done = YES;
        }
        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;
    
    }
    

    使用readstream

    // In bytes
    #define FileHashDefaultChunkSizeForReadingData 256
    
    // Function
    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);
        if (!fileURL) goto done;
    
        // Create and open the read stream
        readStream = CFReadStreamCreateWithFile(kCFAllocatorDefault,
                                                (CFURLRef)fileURL);
        if (!readStream) goto done;
        bool didSucceed = (bool)CFReadStreamOpen(readStream);
        if (!didSucceed) goto done;
    
        // Initialize the hash object
        CC_MD5_CTX hashObject;
        CC_MD5_Init(&hashObject);
    
        // Make sure chunkSizeForReadingData is valid
        if (!chunkSizeForReadingData) {
            chunkSizeForReadingData = FileHashDefaultChunkSizeForReadingData;
        }
    
        // Feed the data to the hash object
        bool hasMoreData = true;
        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;
    }
    

    为方便比较,两个方法每次相同的每次读取大小256k

    三 耗时比较

    耗时测试方法:

    1.采用dispatch_benchmark,对每个文件md5 100次,取平均值
    2.示例代码:

    “`
    - (IBAction)M_md5_10M:(id)sender {
    __block NSString *md5 = nil;

    uint64_t t2 = dispatch_benchmark(_count, ^{
    
        @autoreleasepool {
            NSString *path = [self.paths objectAtIndex:1];
            md5 = [self.class md5WithFilePath:path];
        }
    
    });
    NSLog(@"[md5 10m file:] Avg. Runtime: %llu ns,md5:%@", t2,md5);
    

    }
    “`

    耗时测试结果

    handle耗时:
    handler耗时

    readstream耗时
    readstream

    结论:从上面两张图片可以看出,使用readsteam方法耗时平均比filehandle少50%左右,在iphone6和iphone6s上表现更为明显

    四 . 内存消耗

    内存测试方法

    采用xcode memory 测试工具

    测试结果

    iphone4s, 第一个为handle,第二个为readstream:
    handlereadstream

    iphone5, 第一个为handle,第二个为readstream:
    handlereadstream

    iphone6, 第一个为handle,第二个为readstream:
    handlereadstream

    iphone6s, 第一个为handle,第二个为readstream:
    handle) readstream

    对比结果:readstream在内存上比handle消耗平均也少50%以上.

    结论

    readstream方法在时间和内存消耗上明显优于filehandle,平均都有50%的性能优势.因此选用readstream方法对大文件进行md5摘要.

    展开全文
  • MD5 消息摘要算法

    2016-10-19 16:39:24
    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值...

    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。

    MD5算法具有以下特点:
    1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
    2、容易计算:从原数据计算出MD5值很容易。
    3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
    4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

    MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。

    MD5应用
    1、一致性验证:对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改
    2、数字签名:MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。
    3、安全访问认证:MD5还广泛用于操作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等诸多方面。如在Unix系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。

    MD5将任意长度的“字节串”映射为一个128bit的大整数,并且是通过该128bit反推原始字符串是困难的,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。所以,要遇到了md5密码的问题,比较好的办法是:你可以用这个系统中的md5()函数重新设一个密码,如admin,把生成的一串密码的Hash值覆盖原来的Hash值就行了。

    展开全文
  • MD5 的C语言实现,做成了dll,接口说明见压缩包
  • 文件生成md5摘要

    2016-06-02 10:13:00
    * <P>Desc : 对文件生成md5校验;如果需要加密,可以对生成的md5码,再做一个md5加密 * <P>Update History : * <li></li> * <li></li>  * * */ public class GetFileMD5Util { static Logger logger = ...


    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.security.MessageDigest;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    /**
     * <P>File name : GetFileMD5Util.java </P>
     * <P>Author : zhengxiujiang </P> 
     * <P>Date : 2016年6月2日上午10:10:07 </P>
     * <P>Desc : 对文件生成md5校验;如果需要加密,可以对生成的md5码,再做一个md5加密</P>
     * <P>Update History : <ul>
     *     <li></li>
     *     <li></li> 
     *     </ul>
     * </P>
     */
    public class GetFileMD5Util {
        static Logger logger = LoggerFactory.getLogger(GetFileMD5Util.class);
        static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        /**
         * GetFileMD5Util.getMD5()<BR>
         * <P>Author :  zhengxiujiang </P>  
         * <P>Date : 2016年6月2日上午10:07:56</P>
         * <P>Desc : 生成md5摘要 </P>
         * @param file
         * @return
         */
         public static String getMD5(File file) {
                FileInputStream fis = null;
                try {
                    MessageDigest md = MessageDigest.getInstance("MD5");
                    logger.info("MD5摘要长度:" + md.getDigestLength());
                    fis = new FileInputStream(file);
                    byte[] buffer = new byte[2048];
                    int length = -1;
                    logger.info("开始生成摘要");
                    long s = System.currentTimeMillis();
                      while ((length = fis.read(buffer)) != -1) {
                        md.update(buffer, 0, length);
                    }
                    logger.info("摘要生成成功,总用时: " + (System.currentTimeMillis() - s) + "ms");
                    byte[] b = md.digest();
                    return byteToHexString(b);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    return null;
                }finally {
                    try {
                        fis.close();
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            }
         
         /**
          * GetFileMD5Util.byteToHexString()<BR>
          * <P>Author :  zhengxiujiang </P>  
          * <P>Date : 2016年6月2日上午10:08:17</P>
          * <P>Desc : 字节数组转16进制 </P>
          * @param tmp
          * @return
          */
         private static String byteToHexString(byte[] tmp) {
                String s;
                // 用字节表示就是 16 个字节
                char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
                // 所以表示成 16 进制需要 32 个字符
                int k = 0; // 表示转换结果中对应的字符位置
                for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
                    // 转换成 16 进制字符的转换
                    byte byte0 = tmp[i]; // 取第 i 个字节
                    str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换, 
                    // >>> 为逻辑右移,将符号位一起右移
                    str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
                }
                s = new String(str); // 换后的结果转换为字符串
                return s;
            }
    }

    转载于:https://my.oschina.net/u/2764409/blog/685801

    展开全文
  • MD5数字摘要

    千次阅读 2017-10-23 11:31:48
    数字摘要也成为消息摘要。它是一个唯一对应一个消息或者文本的固定长度的值,它由一个单向 Hash 函数对消息进行计算产生。如果消息在传递的途中改变了,接受者通过对收到的消息采用相同的 hash 函数重新计算,新产生...
  • C++ MD5信息摘要源代码

    2011-06-20 08:37:32
    c++编写的面向对象的MD5信息摘要源代码,包括类头文件和函数定义cpp文件
  • MD5 报文摘要算法

    千次阅读 2017-11-09 17:07:00
    1 执行简介本文描述了MD5报文摘要算法,此算法将对输入的任意长度的信息进行计算,产生一个128位长度的“指纹”或“报文摘要”,假定两个不同的文件产生相同的报文摘要或由给定的报文摘要产生原始信息在计算上是行...
  • MD5消息摘要算法

    2018-05-18 23:59:50
    MD5(Message Digest)消息摘要算法1、实际上,MD5算法是一种散列(hash)算法(又叫摘要算法,指纹算法),不是一种加密算法。任何长度的任意内容都可以用MD5计算出散列值。其主要作用就是“验明真身”,字符串与文件...
  • MD5摘要

    千次阅读 2018-05-23 20:35:35
    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。更多用在文档校验上,用来生成密钥检测...
  • MD5信息摘要算法

    千次阅读 2015-10-03 21:37:07
    MD5信息摘要算法  MD5即Message-Digest Algorithm 5(信息摘要算法5),是计算机广泛使用的散列算法之一(又译摘要算法、哈希算法)。经MD2、MD3和MD4发展而来,诞生于20世纪90年代初。用于确保信息传输完整一致。...
  • 比如,在UNⅨ下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5文件,在这个文件中通常只有一行文本,大致结构如: MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461 这就是tanajiya.tar
  • MD5摘要算法文档.txt

    2021-01-23 19:14:32
    此文本文档是MD5信息摘要算法的描述文档(英文),描述了MD5摘要算法的具体实现,并提供了C语言参考代码,此文件是本人为防止原链接失效而作的备份,如不想消耗积分,请查看此文档的原链接...
  • MD5信息摘要算法的简单理解

    千次阅读 2018-02-16 21:42:14
    一.MD5的简单理解 MD5的全称是Message-Digest Algorithm 5(信息摘要算法),它面向的是32位的电脑,MD5算法会获得一个随机的长度的信息并产生一个128位的信息摘要,(也就是说可以生成一个固定长度为128bit的二进制串...
  • MD5消息摘要的java实现

    2018-05-13 10:54:36
    今天这个程序就是从文件中读取消息,使用MD5进行消息摘要直接上程序:package function; import java.util.*; import java.awt.*; import java.io.BufferedReader; import java.io.File; import java.io....
  • 文件生产MD5摘要

    2015-03-06 10:12:21
    * 对文件全文生成MD5摘要 * * @param file * 要加密的文件 * @return MD5摘要码 */ public static String getMD5(File file) { FileInputStream fis = null; try { MessageDigest md = MessageDigest....
  • MD5消息摘要的C++实现

    千次阅读 2016-05-08 15:29:14
    本文对github上的一个md5计算的项目进行扩展,使得其可以进行字符串md5计算的update操作和对文件md5计算。项目地址:https://github.com/LeeHDsniper/md5
  • MD5信息摘要算法原理及破解原理

    千次阅读 2018-07-11 17:14:13
    虽然目前MD5已经宣布可破解了,但是其算法...比如,在Unix下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5文件,在这个文件中通常只有一行文本,大致结构如: MD5 (tanajiya.tar.gz) = 38b8c2...
  • 可以计算文件的SM3,MD5, SHA1,SHA256摘要值工具,支持拖拽到编辑框自动计算,也可以手动选择,支持保存到剪贴板和保存到文本文件
  • Java MD5消息摘要算法

    2016-09-08 10:41:59
    /** * 这里只是调用JDK自带的MD5算法 * @param data * @return */ public static final String getMD5String(byte[] data) { MessageDigest digest = null; try { digest =
  • MD5摘要算法

    千次阅读 2015-12-20 15:53:08
    package com.lvkun.com; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** ...public class MD5Test {
  • 批量获取文件摘要md5、sha1、sha256)0x01 功能0x02源码0x03运行 0x01 功能 刚刚写了一个小工具:用于批量获取文件摘要md5、sha1、sha256 具体用法: >>>> python3 getFileFeatures.py [参数:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,515
精华内容 13,006
热门标签
关键字:

md5文件摘要