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

Eam*_*orr 0 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;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将其转换为Javascript.我在(*str)第8行的部分遇到了麻烦

(`hash=((hash << 5) + hash) + (*str)`).
Run Code Online (Sandbox Code Playgroud)

如何有效地将我的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;
}
Run Code Online (Sandbox Code Playgroud)

Guf*_*ffa 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;
}
Run Code Online (Sandbox Code Playgroud)

但是,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;
}
Run Code Online (Sandbox Code Playgroud)