为什么在这种情况下h * = h * 101 + s [i]和h = h * 101 + s [i]不同?

时间:2017-12-04 02:43:20

标签: c++ key hash-function

我很好奇为什么这两个函数会产生不同的结果。

unsigned long Hash1(const string s)
{

    int length = s.length();
    unsigned long h = 1;

    for (int i = 0; i < length; i++)
        h *= 101 + (unsigned long)s[i];

    return h;
}

unsigned long Hash2(const string s)
{

    int length = s.length();
    unsigned long h = 1;

    for (int i = 0; i < length; i++)
        h = h * 101 + (unsigned long)s[i];

    return h;
}

int main()
{
    cout << "Value of hash1 = " << Hash1("kelvin@gmail.com") << endl;
    cout << "Value of hash2 = " << Hash2("kelvin@gmail.com") << endl;

    system("pause");
    return 0;
}

h *= 101 + (unsigned long)s[i]是否等于to h = h * 101 + (unsigned long)s[i]

这是输出:

hash1的值 = 1693843456

hash2的值 = 2162085645

感谢您的帮助!!!

2 个答案:

答案 0 :(得分:2)

  

不是h *= 101 + (unsigned long)s[i]等于h = h * 101 + (unsigned long)s[i]

不,由于operator precedenceh *= 101 + (unsigned long)s[i]相当于h *= (101 + (unsigned long)s[i]),与h = h * (101 + (unsigned long)s[i])相同。

两者之间的差异是计算之间的差异:

h = h*(a+b)

h = h*a + b

答案 1 :(得分:1)

答案已在问题的评论中给出,但只是为了扩展问题,两个陈述

h *= 101;

h = h * 101;

确实等同。但是当在较大的表达式中使用时,*=具有非常低的优先级。 *具有最高优先级,然后是+,然后是*=。所以

h *= 101 + x;

与:

相同
h = h * (101 + x);

现在,如果你想要

h = (h * 101) + x;
你可以写下:

(h *= 101) += x;

这是有效的,因为*=运算符返回对左侧的引用。但是,这看起来并不是很好。