可以根据字符串

时间:2015-11-19 16:48:50

标签: python c++ algorithm hash

我希望创建一个简单的c ++哈希函数,它将根据字符串输入返回最大范围内的数字。这样,相同的字符串将始终返回相同的整数值。这是一个任意的例子,其中最大期望范围是36。

Fred Smith -> 25
tree -> 34
Frog -> 0
Fred Smith -> 25
fred smith -> 7

这些数字是任意的,但函数应使用对字符串进行数值计算的算法,并生成定义范围内的整数。我最终将重写此函数以便在Python 2.7中使用。

我正在使用vs2008(又名c ++ 9)并且std :: hash不可用。

我需要一些关于这种方法的建议。

4 个答案:

答案 0 :(得分:2)

为什么不std::hash

#include <iostream>
#include <functional>
#include <string>

int main()
{
    int max = 100;

    std::string str = "Fred Smith";
    std::hash<std::string> hash_fn;

    int num = (int) hash_fn(str) % max;

    std::cout << num << '\n';
}

输出:

33

如果您需要可以跨语言使用的自定义哈希算法实现,我建议您开始herehere

答案 1 :(得分:1)

#Very simple minded hash
def hashval(str, siz):
    hash = 0
    # Take ordinal number of char in str, and just add
    for x in str: hash += (ord(x))
    return(hash % siz) # Depending on the range, do a modulo operation.

print(hashval('stack', 33))

答案 2 :(得分:0)

创建良好哈希的两个重要元素是哈希表大小和盐水哈希(添加自己不可预测的触摸)。通常会有给定字符串的操作进行散列,可能会添加每个字符的ASCII值或某些操作中涉及的字符串长度等。这些是字符串的非常简单的哈希示例。

现在假设我们使用的算法使用字符串中每个字符的ascii值,我们可以合并上面提到的两个元素来创建我们的哈希函数,就像这样......

int hash(string s, int tableSize)
{
    int sum = 0;
    for (int i = 0; i < s.length(); i++)
        sum += int(s[i]) * 3 //<- * 3 being my salt to the hash

    return sum % tableSize;
}

在表格大小模数和腌制时使用素数是很好的做法,因为它可以降低在哈希中创建模式的风险。

我希望这有助于您走上正确的轨道!

答案 3 :(得分:0)

java中的hashmap使用对象的散列函数来获取32字节散列,并使用散列映射实现实现第二个散列函数,以进一步减少散列的长度。在这个问题的回答中解释了这一点:What hashing function does Java use to implement Hashtable class?

您可以查看HashMap实现使用的散列函数,因为它可以生成所需长度的散列。

您可以只取字符串中每个字符的整数表示形式,并计算模数最大值。其中max + 1是您希望散列的最高值。

编辑:

这个HASH很容易逆转,因此取决于你的要求。