C 计算散列MD5

C 计算散列MD5,c,delphi,c++builder,hashcode,vcl,C,Delphi,C++builder,Hashcode,Vcl,我正在尝试使用SubDB API,但在计算文件的哈希值时遇到了问题。散列由视频文件的第一个和最后一个64kb组成,将所有内容放在一起,并生成结果数据的md5(128kb)。以下函数是用python编写的,用于实现哈希算法: def get_hash(name): readsize = 64 * 1024 with open(name, 'rb') as f: size = os.path.getsize(name)

我正在尝试使用SubDB API,但在计算文件的哈希值时遇到了问题。散列由视频文件的第一个和最后一个64kb组成,将所有内容放在一起,并生成结果数据的md5(128kb)。以下函数是用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;
}
测试文件是这样的:,它的散列值(来自上面的算法)应该是ffd8d4aa6803dc03d1c8ef373b9028c。但是,我不能把它弄对


Delphi解决方案也可以。

试试下面的代码怎么样。我只是改变了尺寸,做了正确的Fread,然后去掉了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;
}

你为什么选择(60*1024)而不是(64*1024)?另外,我认为您应该使用memcpy()而不是strcpy(),因为您可能正在处理二进制数据。另一个是在第二个strcpy()中,您应该为位提供正确的偏移量。你实际上是在用最后一位替换第一位。难以置信。。一直以来,我都没有发现我用错了尺寸:)谢谢。