我希望创建一个简单的c ++哈希函数,它将根据字符串输入返回最大范围内的数字。这样,相同的字符串将始终返回相同的整数值。这是一个任意的例子,其中最大期望范围是36。
Fred Smith -> 25
tree -> 34
Frog -> 0
Fred Smith -> 25
fred smith -> 7
这些数字是任意的,但函数应使用对字符串进行数值计算的算法,并生成定义范围内的整数。我最终将重写此函数以便在Python 2.7中使用。
我正在使用vs2008(又名c ++ 9)并且std :: hash不可用。
我需要一些关于这种方法的建议。
答案 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
答案 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很容易逆转,因此取决于你的要求。