[英]Calculating hash MD5
我正在尝试使用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;
}
测试文件是这样的: 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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.