【问题标题】:Is there a Delphi XE2 string hash function guaranteed to be unique that I can use for lookup?是否有保证唯一的 Delphi XE2 字符串散列函数可用于查找?
【发布时间】:2023-03-10 11:10:01
【问题描述】:

我正在使用 TClientDataSet 来管理对象并授予我对对象数据的“数据库”访问权限。到目前为止,这运作良好。我在数据集中有两个“特殊”(隐藏)字段-“ObjectName”和“ObjectRef”。 ObjectName 是对象项的类别和名称的连词,形式为 My category.my object',用于将我从对象实例内部获取到记录号。该字段已编入索引。 'ObjectRef' 是指向该对象实例的指针的整数类型转换,用于所有其他对象生命周期管理。

我必须为“ObjectName”字段选择一个大小,以适应我预期的最大可能类别和名称组合,但这只是一个索引,我希望这个大小尽可能小以提高性能和记忆的原因。是否有一个“无损”函数可以应用于我的表单“我的类别.我的名字”,它仍然是唯一的,我可以用作哈希?哈希函数看起来很聪明,但不是计算机科学专家,我永远不知道如何知道它们的输出是否唯一。

谢谢

【问题讨论】:

  • 您在问是否可以在有限数量的插槽中存储无限数量的对象。答案是否定的。
  • @大卫。我不认为我是。我准备分配所需的任何长度的字段 - 我接受这将是一个限制 - 但我只是希望将我对“我的类别.我的名字”的平淡引用“压缩”成一个独特且更紧凑的引用 - 并且因此可能更有效 - 可索引的字符串。
  • 您还需要限制 My category.my 名称值的长度。然后您可以按原样使用它们。
  • 你真的需要“哈希”是可逆的,还是你只是担心碰撞?
  • @Brian:听起来您需要自动递增的标识值,而不是散列,并在数据库设计中使用 id(整数)而不是主键作为字符串。当然,这些在客户端数据集中不存在,但也许您应该考虑为这些临时表使用真正的 DB 层(可能是 SQLite)。

标签: string delphi hash delphi-xe2


【解决方案1】:

所有散列函数都有冲突的风险,但 AFAIK 更安全的一种是 SHA-1 算法,存在许多 delphi 实现,例如您可以使用 Jwscl library (JEDI Windows Security Code Lib),它是 Windows CryptoAPI 的包装器(你可以在这个问题上找到一个 delphi 示例SHA1 hashing in Delphi XE) 或使用 Indy 中的 TIdHashSHA1 类。

另一种选择是使用更简单的哈希函数(非加密),例如 delphi 在 BobJenkinsHash 方法中实现的 Jenkins 哈希函数。

【讨论】:

  • -1 列出大量哈希算法并不能解决所提出的问题
  • @DavidHeffernan 我认为我对问题Is there a Delphi XE2 string hash function guaranteed to be unique that I can use for lookup? 的回答是有用的,我只提到了 2 种算法(SHA1 和 Jenkins)并解释了所有哈希函数都有碰撞的风险。
  • @DavidHeffernan,请解释一下,为什么你说这些算法都不能用于生成哈希并将值存储在ObjectName字段中?
  • 哈希不好。 Brian 想要一个将任意长字符串映射到有限长度值的函数。并且具有不同输入值总是导致不同输出值的特性。显然不可能存在这样的功能。
  • @DavidHeffernan 我相信哪个 OP 想要在 ObjectName 字段中存储字符串的哈希(类别+名称组合),然后使用这个生成的值作为查找。因此,我将等待 OP cmets 检查我对他的问题的解释是否正确,如果不正确,我将删除我的答案:)。您也可以根据自己对问题的解释添加自己的答案。
【解决方案2】:

没有。根据定义,哈希函数的结果不是唯一的。

您可能需要创建一个本地列表来跟踪应用程序中的 ObjectName,并将唯一索引与添加的每个对象关联起来,这样您就可以将其存储在 DB 中而不是 ObjectName 中。或者在创建时为您的对象分配全局唯一索引(例如 UInt64)

【讨论】:

  • 哈希和压缩本质上是不同的任务。 Hash旨在快速比较,它的输出长度总是不变的。压缩旨在减小大小,但其输出没有大小限制。对于短字符串,您可能经常会得到比原始字符串更大的包大小。
  • @KromStern 模糊哈希没有固定长度:fuzzyhashing.codeplex.com
  • @user Brian 的数据库有固定长度的字段。
  • @user582118:模糊哈希用于不同的上下文
  • @David 是的,DB 字段是固定的,但我的哈希有两个明显的好处 - 我会(在某种程度上)减少字段长度,但索引会改进。
猜你喜欢
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多