最近由于想把下面这段c代码翻译为PHP的,未能成功:
unsigned long myhash(const char *s, long mod){
unsigned char ch;
unsigned int h = 5381;
int len = strlen(s);
while (len > 0) {
ch = *s++ - 'A';
if (ch <= 'Z' - 'A'){
ch += 'a' - 'A';
}
h = ((h << 5) + h) ^ ch;
--len;
}
return h%mod;
}
遇到的问题是:
1. PHP 的整型总是有符号的
2. PHP 的整型在32位机上是32位的,在64位机上是64位的
期望能通过pack,unpack函数来实现,研究了半天,也没有实现。
还想搞清楚的问题:
一个负数 a 模上一个数 M, 和将a强制转换成无符号后模上相同的M,其结果之间是什么关系?
如:
-100 % 15 = -10;
((unsigned) (-100)) % 15 = 6
[root@login ~]# php -r "echo sprintf('%u',-100);"
4294967196
然后用bc算一下就知道了