可以返回基于字符串的整数范围的哈希函数
Hash function that can return a integer range based on string
我想创建一个简单的c++哈希函数,它将根据字符串输入返回一个最大范围内的数字。因此,相同的字符串将始终返回相同的整数值。这里是一个任意的例子,其中最大期望范围是36。
Fred Smith -> 25
tree -> 34
Frog -> 0
Fred Smith -> 25
fred smith -> 7
这些数字是任意的,但函数应该使用一种算法,对字符串进行数字计算,并在定义的范围内得出一个整数。我最终会重写这个函数,以便在Python2.7中使用。
我使用的是vs2008(又名c++9),std::hash不可用。
我需要一些关于方法的建议。
为什么不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
如果您需要一个跨语言工作的自定义哈希算法实现,我建议从这里或这里开始。
#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))
创建好哈希的两个重要元素是哈希表大小和对哈希进行盐化(添加您自己不可预测的触摸)。通常,会对给定的字符串进行散列运算,可能会添加每个字符的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;
}
在做表大小模数和盐析时使用素数是一种很好的做法,因为它可以降低在哈希中创建模式的风险。
我希望这能帮助你走上正轨!
java中的hashmap使用对象的哈希函数来获得32字节的哈希,并使用hashmap实现实现的第二个哈希函数来进一步缩短哈希的长度。这个问题的答案是:Java使用什么哈希函数来实现Hashtable类?
您可以查看HashMap实现所使用的哈希函数,因为它可以生成所需长度的哈希。
你可以只取字符串中每个字符的整数表示,并计算取模最大值的和。其中max+1是你希望哈希为的最高值。
编辑:
这种HASH很容易逆转,所以它取决于您的需求。
- 将超出范围的整数分配给有符号字符类型
- 如何仅使用 While 循环在给定范围内找到可被 7 整除的计数整数
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 当我尝试将范围值存储为 8 位的固定宽度整数时,它向我显示一些其他值 [ASCII]
- 将整数范围映射到另一个范围
- C++标准强加的整数范围
- 如何编写一个 boost::spirit::qi 解析器来解析从 0 到 std::numeric_limits:<int>:max() 的整数范围?
- 特定整数范围内的数组值
- C++ 中的整数范围 - 当标准尚不存在时我该怎么办
- 生成编译时整数范围时类型不完整
- 浮点数或整数范围内的随机数
- 基于整数范围的模板专业化
- 可以返回基于字符串的整数范围的哈希函数
- 使用整数范围的算法
- 是否有一种简单/优雅的方法将整数范围压入STD向量?
- 将从0到x的整数范围分配给容器的最快方法
- 将整数范围划分为几乎相等的整数范围
- 将有符号整数范围映射为无符号
- 模板类中模板方法的基于整数范围的专用化
- 具有整数范围的Enum