基于字符串返回整型范围的哈希函数
我想写一个简单的C++哈希函数,这个函数会根据输入的字符串返回一个数字,这个数字在一个最大范围内。也就是说,同样的字符串每次都会返回相同的整数值。下面是一个例子,假设我们希望的最大范围是36。
Fred Smith -> 25
tree -> 34
Frog -> 0
Fred Smith -> 25
fred smith -> 7
这些数字是随便举的例子,但这个函数应该用一种算法,对字符串进行计算,最后得到一个在我们定义的范围内的整数。之后我还会把这个函数改写成Python 2.7的版本。
我现在使用的是vs2008(也叫c++9),而std::hash这个功能是不可用的。
我需要一些关于如何实现这个函数的建议。
相关文章:
- 暂无相关问题
4 个回答
在Java中,哈希表(hashmap)使用对象的哈希函数来生成一个32字节的哈希值,然后再通过哈希表的实现使用第二个哈希函数,进一步缩短这个哈希值的长度。这个过程在这个问题的回答中有详细解释:Java使用什么哈希函数来实现Hashtable类?
你可以查看哈希表实现中使用的哈希函数,因为它可以生成你想要长度的哈希值。
你也可以简单地把字符串中每个字符的整数表示取出来,然后计算它们的和,再对最大值取模。这里的max+1就是你希望哈希值的最大值。
编辑:
这个哈希值是可以轻松反向推导的,所以这要看你的具体需求。
在创建好的哈希值时,有两个重要的因素:哈希表的大小和给哈希值加盐(也就是加入一些不可预测的元素)。通常,我们会对要哈希的字符串进行一些操作,比如把每个字符的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;
}
在进行表大小的取模运算和加盐时使用质数是个好习惯,因为这样可以减少哈希值中出现规律的风险。
希望这些信息能帮助你走上正确的道路!
在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在另一个地方使用这些数据。这个过程就像是把水从一个水桶倒到另一个水桶里。
有些时候,我们会遇到一些问题,比如数据的格式不对,或者数据不完整。这就像是你在倒水的时候,发现水桶有个洞,水漏了出去。
为了避免这些问题,我们可以使用一些工具和方法来确保数据的完整性和正确性。就像在倒水之前,先检查水桶有没有破损,确保水能顺利倒进去。
总之,处理数据的时候要小心谨慎,确保每一步都能顺利进行,这样才能得到我们想要的结果。
#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))