Javascript:请帮我把这个C函数转换为Javascript

时间:2011-07-26 14:43:16

标签: javascript c

我有以下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;
}

3 个答案:

答案 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));
}