是否有一个Delphi XE2字符串哈希函数保证是唯一的,我可以用于查找?

时间:2012-07-26 08:21:12

标签: string delphi hash delphi-xe2

我使用TClientDataSet来管理对象并让我“数据库”访问对象数据。到目前为止,这很有效。我在数据集中有两个“特殊”(隐藏)字段 - “ObjectName”和“ObjectRef”。 ObjectName是My category.my对象形式中对象项的类别和名称的连接,用于将我从对象实例内部转移到记录号。该字段已编入索引。 'ObjectRef'是指向该对象实例的指针的整数代码,用于所有其他对象生存期管理。

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

由于

2 个答案:

答案 0 :(得分:6)

所有散列函数都有冒充的风险,但AFAIK更安全的是SHA-1算法,存在许多delphi实现,例如你可以使用Jwscl library (JEDI Windows Security Code Lib)这是{{的包装器3}}(你可以在这个问题上找到一个delphi样本Windows CryptoAPI)或者使用属于Indy的TIdHashSHA1类。

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

答案 1 :(得分:2)

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

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