【问题标题】:Unique hash of string words字符串单词的唯一哈希
【发布时间】:2018-03-12 01:44:39
【问题描述】:

我正在为任意字符串单词(最大可能长度

    int getKey(string value){
    int key = 0;
    int temp = 0;
    int length = value.length();
    for (int i = 0; i < length; i ++){
        temp = (int)value[i];
        key = key + temp;
    }
    return key;
}

但是,我很快意识到这种方法会导致太多重复(例如,由相同字母组合组成的单词)。所以我想知道是否有办法获得一个 C++ int 表示的哈希值,该值对于给定长度下的任何单词都是唯一的?

谢谢!

【问题讨论】:

  • 你考虑过std::hash吗?
  • 散列函数的一个基本属性是,如果生成的散列具有n 位的精度,那么对于所有大于n 位的可能输入集,它在数学上不可能是唯一的。因此,如果您需要一个“对给定长度下的任何单词唯一”的散列函数,则散列函数必须产生一个长度相同的字节数的结果。换句话说,散列函数与要散列的字符串相同。 Q.E.D.
  • 谷歌“哈希函数”,你会发现大量的例子和理论可以帮助你。如果您已经这样做了,请编辑您的问题并讨论您发现了什么以及为什么它对您不起作用。
  • 使用东西的总和作为哈希是不好的,因为某些值比其他值有更高的返回机会,因为它们可以以多种不同的方式求和。 idownvotedbecau.se/noresearch 快速搜索“字符串哈希”会给你答案。

标签: c++ string hash integer hashtable


【解决方案1】:

如果我们考虑在一个典型的文本字符串中大约有 5 位信息(26 个大写字母,26 个小写字母,一些标点符号大约有 64 个不同的字符),那么对于 26 个字符的字符串,您将需要大约 130 位和一个完美的哈希函数来避免冲突。如果可以接受罕见的冲突,请使用 std::hash&lt;&gt; - 它返回通常为 64 位的 size_t - 或者如果您想要统计上唯一的哈希值,则使用类似 SHA256 的东西。

更多技术细节可能在Cryptography StackExchange 上找到。

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2017-06-04
    • 2018-04-24
    • 1970-01-01
    相关资源
    最近更新 更多