c代码翻译为PHP时遇到的问题

最近由于想把下面这段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算一下就知道了

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据