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