如何计算在C大文件的MD5哈希? [英] How to calculate the MD5 hash of a large file in C?

查看:613
本文介绍了如何计算在C大文件的MD5哈希?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用OpenSSL库C语言编写。

我如何计算一个大文件使用MD5哈希?

据我所知,我需要加载整个文件到内存的字符数组,然后调用哈希函数。但是,如果该文件是关于什么的4Gb长时间?听起来像一个坏主意。

解决:感谢 askovpen ,我发现我的错误。我用

 ,而((字节= FREAD(数据,1,1024,INFILE))!= 0)
    MD5_Update(安培; mdContext,数据,1024);

不是

 ,而((字节= FREAD(数据,1,1024,INFILE))!= 0)
    MD5_Update(安培; mdContext,数据,字节);


解决方案

例如

GCC -lssl -lcrypto -g -Wall -o文件fil​​e.c中

 的#include<&stdio.h中GT;
#包括LT&;的OpenSSL / md5.h>诠释的main()
{
    unsigned char型C [MD5_DIGEST_LENGTH]
    字符*文件名=file.c中;
    INT I;
    FILE * INFILE = FOPEN(文件名,RB);
    MD5_CTX mdContext;
    诠释字节;
    unsigned char型数据[1024];    如果(INFILE == NULL){
        的printf(%s不能打开\\ n,文件名);
        返回0;
    }    MD5_Init(安培; mdContext);
    而((字节= FREAD(数据,1,1024,INFILE))!= 0)
        MD5_Update(安培; mdContext,数据,字节);
    MD5_Final(C,&安培; mdContext);
    对于(i = 0; I< MD5_DIGEST_LENGTH;我++)的printf(%02X,C [I]);
    的printf(%S \\ n,文件名);
    FCLOSE(INFILE);
    返回0;
}

结果:

  $的md5sum file.c中
25a904b0e512ee546b3f47574703d9fc file.c中
$ ./file
25a904b0e512ee546b3f47574703d9fc file.c中

I am writing in C using OpenSSL library.

How can I calculate hash of a large file using md5?

As I know, I need to load a whole file to RAM as char array and then call the hash function. But what if the file is about 4Gb long? Sounds like a bad idea.

SOLVED: Thanks to askovpen, I found my bug. I've used

while ((bytes = fread (data, 1, 1024, inFile)) != 0)
    MD5_Update (&mdContext, data, 1024);

not

while ((bytes = fread (data, 1, 1024, inFile)) != 0)
    MD5_Update (&mdContext, data, bytes);

解决方案

example

gcc -lssl -lcrypto -g -Wall -o file file.c

#include <stdio.h>
#include <openssl/md5.h>

int main()
{
    unsigned char c[MD5_DIGEST_LENGTH];
    char *filename="file.c";
    int i;
    FILE *inFile = fopen (filename, "rb");
    MD5_CTX mdContext;
    int bytes;
    unsigned char data[1024];

    if (inFile == NULL) {
        printf ("%s can't be opened.\n", filename);
        return 0;
    }

    MD5_Init (&mdContext);
    while ((bytes = fread (data, 1, 1024, inFile)) != 0)
        MD5_Update (&mdContext, data, bytes);
    MD5_Final (c,&mdContext);
    for(i = 0; i < MD5_DIGEST_LENGTH; i++) printf("%02x", c[i]);
    printf (" %s\n", filename);
    fclose (inFile);
    return 0;
}

result:

$ md5sum file.c
25a904b0e512ee546b3f47574703d9fc  file.c
$ ./file
25a904b0e512ee546b3f47574703d9fc file.c

这篇关于如何计算在C大文件的MD5哈希?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆