计算哈希MD5

标签 c delphi c++builder hashcode vcl

我正在尝试使用 SubDB API,但在计算文件的哈希值时遇到问题。哈希是通过将视频文件的第一个和最后一个 64kb 放在一起并生成结果数据 (128kb) 的 md5 来组成的。以下用 python 编写的函数实现了哈希算法:

def get_hash(name):
        readsize = 64 * 1024
        with open(name, 'rb') as f:
            size = os.path.getsize(name)
            data = f.read(readsize)
            f.seek(-readsize, os.SEEK_END)
            data += f.read(readsize)
        return hashlib.md5(data).hexdigest()

我正在使用 C++ Builder XE2,我尝试将其翻译如下:

String __fastcall MD5Hash(const AnsiString filename)
{
     String result;
     char firstbits[60*1024], lastbits[60*1024];
     char bits[120*1024];

     FILE* f = fopen(filename.c_str(), "rb");
     if(f ==NULL) {ShowMessage("Error!"); return "";}
     TIdHashMessageDigest5 *idmd5= new TIdHashMessageDigest5();
     try  {
        fread(firstbits, 60*1024, 1, f);
        fseek(f, -(long)60*1024, SEEK_END);
        fread(lastbits, 60*1024, 1, f);
        strcpy(bits, firstbits);
        strcpy(bits, lastbits);
        result= idmd5->HashBytesAsHex(RawToBytes(bits, 120*1024));
     }
     __finally    {
        delete idmd5;
     }
     fclose(f);
     return result;
}

测试文件是这样的:http://thesubdb.com/api/samples/dexter.mp4 ,它的哈希值(根据上面的算法)应该是 ffd8d4aa68033dc03d1c8ef373b9028c。但是,我无法正确理解...

Delphi 解决方案也可以。

最佳答案

试试下面的代码怎么样。我只是更改了大小,进行了正确的读取,并删除了 strcpy。

String __fastcall MD5Hash(const AnsiString filename)
{
     String result;
     char bits[128*1024];

     FILE* f = fopen(filename.c_str(), "rb");
     if(f ==NULL) {ShowMessage("Error!"); return "";}
     TIdHashMessageDigest5 *idmd5= new TIdHashMessageDigest5();
     try  {
        fread(bits, 64*1024, 1, f);
        fseek(f, -(long)64*1024, SEEK_END);
        fread(&bits[64*1024], 64*1024, 1, f);
        result= idmd5->HashBytesAsHex(RawToBytes(bits, 128*1024));
     }
     __finally    {
        delete idmd5;
     }
     fclose(f);
     return result;
}

关于计算哈希MD5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17039206/

相关文章:

delphi - 在Delphi中绘制流程图

c++ - 如何从 C++ 调用 Delphi DLL WideString 参数(包括 var 参数)

closures - C++Builder控制台应用程序: linking to a __closure based method

c - 递归函数C排名

c - 如何在 C 中将 float 与整数相乘?

c - 没有线程或高级库的 C 并行编程

c - printf如何处理字符串

delphi - 数据集取消或中止(正确的方法)?

sql-server - TAdoDataSet、TAdoStoredProc 多个结果集

boolean - 将 Variant 转换为 bool