可以返回基于字符串的整数范围的哈希函数

Hash function that can return a integer range based on string

本文关键字:整数 范围 哈希 函数 字符串 返回      更新时间:2023-10-16

我想创建一个简单的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很容易逆转,所以它取决于您的需求。