1

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

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

谢谢

4

2 回答 2

6

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

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

于 2012-07-26T20:06:46.037 回答
2

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

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

于 2012-07-26T08:32:11.713 回答