在我正在阅读的一本书中,有一个哈希函数,如下所示
static inline ulong zend_inline_hash_func(const char *arKey, uint nKeyLength)
{
register ulong hash = 5381;
for (uint i = 0; i < nKeyLength; ++i) {
hash = ((hash << 5) + hash) + arKey[i];
}
return hash;
}
hash << 5 + hash
表达式与hash * 32 + hash
或hash * 33
相同。
我理解为什么hash << 5 + hash
与hash * 32 + hash
相同,但它如何成为hash * 33
是我不理解的。
我试图推断hash * 32
溢出并包装成为模2 ^ n操作,但显然不是因为a)hash
属于ulong
类型
这足以容纳hash *32
表达式的结果。 b)即使unint
仍然很大,因为有问题的乘法会溢出
拥有更多C知识的人可以通过简单的解释帮助我,甚至可能指出我的困惑的根源。
谢谢你。
答案 0 :(得分:2)
这与C语言无关,而与数学有关。
哈希&lt;&lt; 5 + hash表达式与hash * 32 + hash或hash * 33相同。
基本代数陈述这些事情是真的(这些是用C语言写的):
/* #1 */ (a * b + a * c) == (a * (b + c))
/* #2 */ (a) == (a * 1)
应用#2,我们可以说:
(hash * 32 + hash) == (hash * 32 + hash * 1)
现在应用#1,我们可以找到:
(hash * 32 + hash * 1) == (hash * (32 + 1))
这可以简化为:
hash * 33
这是基础数学,但也许你累了或过度工作,只是看不出它是如何工作的:)