对大文件怎么怎么算MD5呢?

SYSDP 2008-06-12 11:43:37
文件内容有可能大于内存,
在不能一次全都读出的情况下,
C++中有什么好的方法嘛?

谢谢先啊
--
...全文
1462 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
myoswin7 2010-11-28
  • 打赏
  • 举报
回复
用md5软件打开对比md5信息 就是验证文件有没有被重新修改过
md5的全称是message-digest algorithm 5(信息-摘要算法),在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest开发出来,经md2、md3和md4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是md2、md4还是md5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但md2的设计与md4和md5完全不同,那是因为md2是为8位机器做过设计优化的,而md4和md5却是面向32位的电脑。这三个算法的描述和c语言源代码在internet rfcs 1321中有详细的描述
myoswin7 2010-11-28
  • 打赏
  • 举报
回复
mark
jungzhang 2010-06-21
  • 打赏
  • 举报
回复
md5不熟悉
yyjshpy 2008-09-28
  • 打赏
  • 举报
回复
回帖是一种美德!传说每天回帖即可获得 10 分可用分!
mLee79 2008-06-13
  • 打赏
  • 举报
回复
这东西无需验证, 看下MD5的原理自然知道:

$ cat t2.c; gcc -o t2 t2.c `pkg-config openssl --cflags --libs`; ./t2
/***************************************************************/
#include <stdio.h>
#include <openssl/md5.h>
#include <openssl/rand.h>

typedef unsigned char byte;
#define INPUT_LEN (1024+123)

void test1( byte* input , int len , int l1 )
{
int i;
byte md5[16];
MD5_CTX ctx;
MD5_Init( &ctx );
for( ;len >= l1; input += l1 , len -= l1 )
MD5_Update( &ctx , input , l1 );
if( len )
MD5_Update( &ctx , input , len );
MD5_Final( md5 , &ctx );

for( i = 0; i < 16; ++i )
printf( "%02X " , md5[i] );
printf( " : %d\n" , l1 );
}
int main()
{
int l1;
byte input[INPUT_LEN];
RAND_bytes( input , sizeof( input ) );

for( l1 = 1; l1 <= INPUT_LEN; l1 <<= 1 )
test1( input , sizeof( input ) , l1 );
return 0;
}
/***************************************************************/
AD 84 BB AF 9C E9 5A DD 7D CB 3A 3F C8 E1 63 03 : 1
AD 84 BB AF 9C E9 5A DD 7D CB 3A 3F C8 E1 63 03 : 2
AD 84 BB AF 9C E9 5A DD 7D CB 3A 3F C8 E1 63 03 : 4
AD 84 BB AF 9C E9 5A DD 7D CB 3A 3F C8 E1 63 03 : 8
AD 84 BB AF 9C E9 5A DD 7D CB 3A 3F C8 E1 63 03 : 16
AD 84 BB AF 9C E9 5A DD 7D CB 3A 3F C8 E1 63 03 : 32
AD 84 BB AF 9C E9 5A DD 7D CB 3A 3F C8 E1 63 03 : 64
AD 84 BB AF 9C E9 5A DD 7D CB 3A 3F C8 E1 63 03 : 128
AD 84 BB AF 9C E9 5A DD 7D CB 3A 3F C8 E1 63 03 : 256
AD 84 BB AF 9C E9 5A DD 7D CB 3A 3F C8 E1 63 03 : 512
AD 84 BB AF 9C E9 5A DD 7D CB 3A 3F C8 E1 63 03 : 1024
SYSDP 2008-06-13
  • 打赏
  • 举报
回复
不管怎么分段,不管怎么读,结果都一样?
用程序验证了嘛?
晨星 2008-06-13
  • 打赏
  • 举报
回复
MD5本来就对输入的长度没有要求。
当然,用法上确实是有要求的。
看看标准就明白了。
haowaj 2008-06-13
  • 打赏
  • 举报
回复
分包啊,每个包用同样结构http://www.haowaj.com
K行天下 2008-06-13
  • 打赏
  • 举报
回复
这东西无需验证, 看下MD5的原理自然知道:

顶!
  • 打赏
  • 举报
回复
可以读取一部分算一部分
最后将每一部分的结果连接起来再算。
不好指出是不通用。
mLee79 2008-06-12
  • 打赏
  • 举报
回复
谁告诉你分成不同的段来读, 结果不一样 ...
MD5(不光MD5,现在所知的安全散列算法都一样)的结果不受分段方式影响, 只要稀饭你就可以一个字节一个字节的读, 只是慢点而已 ...
shuiyan 2008-06-12
  • 打赏
  • 举报
回复
同一段数据,得出的MD5就是相同的,不然如何验证。
而同一段数据,分成不同的段来读,每段的长度不一样,那么得出的MD5码当然也不一样。
要统一结果,那么就必须统一算法,截取点的要求必须一致。
mLee79 2008-06-12
  • 打赏
  • 举报
回复
MD5本来就是一段一段求的, 啥时候又要一次读入内存了...
SYSDP 2008-06-12
  • 打赏
  • 举报
回复
这样是可以算MD5,可我算的跟别人算的能一样嘛?
通用的方法,每个人人算的都一样,那就好了

64,700

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧