Javascript: Пожалуйста, помогите мне преобразовать эту функцию C в Javascript - PullRequest
0 голосов
/ 26 июля 2011

У меня есть следующая 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.У меня проблемы с (*str) частью строки 8

(`hash=((hash << 5) + hash) + (*str)`).

Как мне эффективно преобразовать мою строку javascript в то же представление, что и в C?

Вот что я сделал, софар, но он не работает: когда я добавляю ноль к "str", он просто добавляет символ "0" к моей str.Что я делаю не так?

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 ]

6 голосов
/ 26 июля 2011

В 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 голос
/ 26 июля 2011

Я думаю, что вы имеете в виду str.charCodeAt(i), а не str+0.

0 голосов
/ 26 июля 2011

Просто избавьтесь от указателя махинаций и итерируйте, используя только i:

for(i = 0; i < len; i++)
{
      hash = ((hash << 5) + hash) + (str.charAt(i));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...