我有以下C
功能:
unsigned int DJBHash(char* str, unsigned int len)
{
unsigned int hash = 5381;
unsigned int i = 0;
for(i = 0; i < len; str++, i++)
{
hash = ((hash << 5) + hash) + (*str);
}
return hash;
}
我正在尝试将其转换为Javascript。我遇到了第8行(*str)
部分的问题
(`hash=((hash << 5) + hash) + (*str)`).
我如何有效地将我的javascript
字符串转换为与C
中相同的表示形式?
这是我已经完成的操作,但它不起作用:当我向“str”添加零时,它只是在我的str上添加一个字符“0”。我做错了什么?
function DJBHash(str,len){
var hash=5381;
var i=0;
for(i=0;i<len;i++){
hash=((hash<<5)+hash)+(str+0);
}
return hash;
}
答案 0 :(得分:6)
Javascript中没有指针。将输入视为字符串而不是指向字符串的指针。该字符串具有长度,因此您不需要将其作为参数发送,并且字符串对象具有charCodeAt
方法,您可以使用该方法在循环期间获取特定字符的字符代码:
function DJBHash(str) {
var hash = 5381;
for(var i = 0; i < str.length; i++) {
hash = ((hash << 5) + hash) + str.charCodeAt(i);
}
return hash;
}
但是,C代码可能依赖于int
具有特定大小(但不符合C规范),使用溢出将结果限制为特定的位数。由于Javascript没有任何整数类型,您必须使用整数运算以相同的方式限制结果。这将产生32位结果:
function DJBHash(str) {
var hash = 5381;
for(var i = 0; i < str.length; i++) {
hash = (((hash << 5) + hash) + str.charCodeAt(i)) & 0xffffffff;
}
return hash;
}
答案 1 :(得分:1)
我认为您的意思是str.charCodeAt(i)
,而不是str+0
。
答案 2 :(得分:0)
只需摆脱指针shenanigans,并仅使用i
进行迭代:
for(i = 0; i < len; i++)
{
hash = ((hash << 5) + hash) + (str.charAt(i));
}