【问题标题】: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 位数字。好吧,即使它有两部分,您的钥匙也是一把钥匙。

标签: c++ hash-function


【解决方案1】:

一般方法是:

  1. 将数据序列化为字节流。
  2. 为结果字节缓冲区创建一个std::string_view 并使用其哈希

第 1 步的有效解决方案可能难以实现,因为 C++ 没有标准的数据序列化方法。一个简单但非最佳的解决方案是简单地转换为文本字符串,在这种情况下我们也不需要字符串视图。

在您的示例中,您可以使用:

std::string data = name + std::to_string(phone);
std::size_t hash = std::hash<std::string>{}(data);

通过定义通用散列函数,您可以单独流式传输各个对象的字节,而无需先将它们存储在连续的缓冲区中。

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 2011-06-09
    • 2016-03-25
    • 2019-05-03
    • 1970-01-01
    • 2021-04-06
    • 2012-07-31
    • 2020-07-16
    相关资源
    最近更新 更多