如何实现具有两个或更多键的哈希函数?
Posted
技术标签:
【中文标题】如何实现具有两个或更多键的哈希函数?【英文标题】:How do I implement a hash function with two keys or more? 【发布时间】:2021-01-05 16:17:20 【问题描述】:我目前正在研究 C++ 中的数据结构和算法学期项目。我想实现一个哈希函数来使用他的名字(字符串)和他的电话号码(整数)访问一个人的数据。我还计划使用开放寻址处理冲突(如果此信息相关)。另外,我不允许使用任何 STL 库函数。
【问题讨论】:
boost有个方便的功能hash_combine,即使不能直接使用也可以随时捏源码。 你应该首先为一个字符串实现一个散列函数。一旦你有了它,就有几种可能的解决方案来散列多个值。 通用散列函数,可以散列任何字节数组,en.wikipedia.org/wiki/…。 您不是在询问“姓名+电话”的哈希值吗?你的意思是如果你只有名字或只有电话,你想在哈希表中查找,但不是两者都有,不是吗?如果我是对的,您可以从上面的 cmets 中看到,您需要通过 editing 来澄清您的问题。 你的两把钥匙其实就是一把钥匙。就像电话号码是一把钥匙一样,即使它有 10 位数字。好吧,即使它有两部分,您的钥匙也是一把钥匙。 【参考方案1】:一般方法是:
-
将数据序列化为字节流。
为结果字节缓冲区创建一个
std::string_view
并使用其哈希
第 1 步的有效解决方案可能难以实现,因为 C++ 没有标准的数据序列化方法。一个简单但非最佳的解决方案是简单地转换为文本字符串,在这种情况下我们也不需要字符串视图。
在您的示例中,您可以使用:
std::string data = name + std::to_string(phone);
std::size_t hash = std::hash<std::string>(data);
通过定义通用散列函数,您可以单独流式传输各个对象的字节,而无需先将它们存储在连续的缓冲区中。
【讨论】:
以上是关于如何实现具有两个或更多键的哈希函数?的主要内容,如果未能解决你的问题,请参考以下文章