【问题标题】:Is there a C++ hash function that returns hash as a mixture of letters and strings?是否有一个 C++ 哈希函数将哈希作为字母和字符串的混合返回?
【发布时间】:2021-02-25 16:41:31
【问题描述】:

我知道 C++ 中的 STL std::hash 类仅以数字形式返回哈希,即使对于字符串也是如此。但是我想要一个哈希函数,它在 c++ 中传递一个整数时将哈希作为字母和字母的混合返回,并且冲突更少。有没有我可以使用的标准库函数?

我想要这样的东西: H(12345) = a44f81ji234kop 碰撞次数最少且分布良好。

【问题讨论】:

  • 不,标准库中没有这样的哈希函数,hash concept 需要获取std::size_t 值。
  • 哈希产生比特;如何解释这些位由您决定。
  • 你能解释一下什么是“字母和字符串的混合物”吗?字符串可以包含数字和字母。
  • 这篇帖子几乎散发着XY problem 的气息,所以你为什么不告诉我们你真正想要做什么呢?为什么正是你需要这个?这听起来像您想要一个 base64 编码的加密摘要。毫无疑问,它会给你一个体面的分布,而不是你可以将它用于任何事情(当然不能用于 std::unordered_map 的键,反正它只会把它变成一个数字)。当你说, "... with less collisions" - 比 what 更少的碰撞? std::hash<int> ?
  • 您的输出格式看起来像原始字节的 base32、base36 或 base64 编码。没有什么特别的。您可以轻松地将数字结果转换为该格式。我同意@WhozCraig 这听起来像是一个 XY 问题。

标签: c++ string hash stl hash-function


【解决方案1】:

您可以选择任何您喜欢的普通哈希函数,然后将其转换为“a44f81ji234kop”样式的文本作为第二步(如下所述)。标准库不会尝试对哈希函数质量提供任何保证,所以如果您似乎想要这些,您最好选择第三方库,例如https://github.com/stbrumme/hash-library

获得数字后,您可以使用base-36 encoding 将其转换为您喜欢的数字加文本表示形式。转换时可以指定基数

  • int->文本使用std::to_chars
  • text->int(即,如果您想从基数 36 值中取回数字哈希值)使用 stoi

【讨论】:

    【解决方案2】:

    遗憾的是,C++ 标准库缺乏将散列或不同类型的多个对象散列到一个散列中的功能。

    一种好方法是使用来自Types Don't Know # 的哈希基础架构:

    这里解决的问题是如何支持使用M种不同的哈希算法对N种不同类型的key进行哈希,使用与N+M成正比的源代码量,而不是当前基于std::hash<T>的系统这需要与 N*M 成比例的源代码量。因此,在今天的实践中,M==1,并且单一散列算法仅由std::lib 实现者提供。因为客户端为所有内置标量类型(intlongdouble 等)提供替代算法太困难且容易出错。事实上,委员会甚至很难为我们的客户可能合理地希望用作键的所有类型提供散列支持:pairtuplevectorcomplexdurationforward_list

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 2021-12-23
      • 2013-05-02
      • 1970-01-01
      • 2013-11-21
      • 2021-11-19
      • 1970-01-01
      相关资源
      最近更新 更多