需要帮助提出哈希函数算法

时间:2012-05-01 01:31:05

标签: algorithm hash

我正在研究一个哈希函数,它通过将该字符串映射到键来给给定字符串一个“ID”。我需要使用的算法如下所述:

  • 给定字符串NOTE,我们为每个字母分配一个值,例如:

    N = 14, O =15, T = 20, E = 5
    
  • 然后我们相乘并添加:

    14 * 32^3 + 15 * 32^2 + 20 * 32^1 + 5 * 32^0
    
  • 通过对此表达式进行分解,我们得到:

    ((14 * 32 + 15) * 32 + 20) * 32 + 5
    
  • 但是这个值可能会变得太大,所以我们在每组括号后使用mod除法:

    ((14 * 32 + 15)%tableSize *32 + 20)%tableSize * 32 + 5
    

如何创建算法来实现此目的?我试过这样做,但我的实现效率非常低。我的教授说它不应该长于7行。有人可以提供有关如何有效实施上述算法的建议吗?

我的算法,如果有人关心的话:

int HashDictionary::getKey(string word) const{
    int wordLength = word.length();
    int* values = new int[wordLength];
    for ( int i = 0; i < wordLength; i++ ) {
        values[i] = int(word[i]);
    }

    int productSoFar = 0;
    for(int i = 0; i < wordLength;i++){
        productSoFar *= 32;

        if(i == 0){
            productSoFar = values[i] * 32;
            productSoFar = productSoFar + values[i+1];
            productSoFar %= tableSize;
            i++;
        }
        else{
            productSoFar += values[i];
            productSoFar %= tableSize;
        }

    }
    delete [] values;
    return productSoFar;
}

2 个答案:

答案 0 :(得分:1)

你不应该需要2个循环;因为第一件事就是将字符转换为整数,你可以根据需要翻译它们,并完全避免使用数组。这应该加快速度并减少你的行数。

答案 1 :(得分:0)

试试这个:

int HashDictionary::getKey(string word) const{
    int wordLength = word.length();
    int* values = new int[wordLength];
    values[0] = int(word[0]);
    values[1] = int(word[1]);

    int productSoFar = 0;
    productSoFar = values[0] * 32;
    productSoFar = productSoFar + values[1];
    productSoFar %= tableSize;

    for(int i = 1; i < wordLength;i++){
        productSoFar *= 32;
        productSoFar += values[i];
        productSoFar %= tableSize;
        values[i] = int(word[i]);
        }
    delete [] values;
    return productSoFar;
}