【问题标题】:Get PDF MD5 Hash in Delphi在 Delphi 中获取 PDF MD5 哈希
【发布时间】:2016-02-29 10:44:04
【问题描述】:

我正在使用 Delphi 从 pdf 文件生成哈希 MD5。 我想生成与 CouchDB 附件哈希相同的哈希, 但我得到了不同的结果。

我生成哈希的函数:

function TPliki.generujHashMD5(zawartoscPliku: TMemoryStream): string;
var
  tekstPliku: string;

begin
  setString(tekstPliku, PAnsiChar(zawartoscPliku.Memory), zawartoscPliku.Size);
  result := THashMD5.GetHashString(tekstPliku);
end;
  1. 在函数之前,我使用 TMemoryStream.LoadFromFile(path) 将文件加载到 TMemoryStream
  2. 调用这个函数TPliki.GenerujHashMD5(fileContent): string;
  3. 在此函数中,我生成哈希并返回带有结果的字符串。 当我从 Base64 CouchDB Hash 解码时,我的哈希值不同。

CouchDB 中的附件设置:

compressible_types: text/*, application/javascript, application/json, application/xml
compression_level: 0

【问题讨论】:

  • 首先你要检查couch db使用了什么样的哈希算法
  • 您确定zawartoscPliku.Memory 永远不会包含NULL 字符吗?这可能会导致在转换为 PAnsiChar 时提前终止。
  • 我正在生成 PDF 文件,然后我对其内容进行哈希处理。我认为它必须至少有一个字符。

标签: delphi pdf hash couchdb md5


【解决方案1】:

您的代码的问题是您正在将 PDF 文件的内容 - 二进制数据转换为 Unicode 字符串,并且您正在更改其内容。这会改变你的哈希值。

您应该以不同的方式使用THashMD5,并直接提供二进制数据而不将其转换为字符串。

function TPliki.generujHashMD5(zawartoscPliku: TMemoryStream): string;
var
  hash: THashMD5;
begin
  hash := THashMD5.Create;
  hash.Update(zawartoscPliku.Memory, zawartoscPliku.Size);
  result := hash.HashAsString;
end;

【讨论】:

  • 我有一个问题 - 我可以在文档中看到 (docwiki.embarcadero.com/Libraries/XE8/en/System.Hash.THashMD5), THashMD5 是静态记录,但为什么我需要调用 Create() ?不应该有内存泄漏吗?或者也许在 Update() 之前使用 Rest() 来清除内容?
  • 我没有 XE8,所以我无法检查源代码,但如果 Delphi 库提供 Create 进行记录,这意味着它需要一些额外的初始化(除了纯内存分配)。即使它目前没有它,将来也可能需要这样的初始化。如果Create 是公共 API 的一部分,那么在您的代码中使用它是安全的。或者换句话说,你使用它不花钱,如果你不使用它可能会花钱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 2010-11-11
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多