Как перенести алгоритм вычисления хеша на lua?

Есть алгоритм на Си:
extern uint32 HashRot13(const uint8 * str, int length)
{
    uint32 hash = 0;
    int i;
    for(i = 0; i < length; ++i, str++)
    {
        hash += (uint32)(*str);
        hash -= (hash << 13) | (hash >> 19);
    }
    return hash;
}


Как перенести его на Lua? Или хотя бы расскажите, что он делает.
  • Вопрос задан
  • 840 просмотров
Решения вопроса 1
vvzvlad
@vvzvlad Автор вопроса
function HashRot13(bytes)
hash = 0
for i = 1, #bytes do
hash = hash + bytes[i]
hash = bit.band(hash - bit.rol(hash, 13), 0xFFFFFFFF)
end
return bit.bswap(hash)
end
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@vilgeforce
Раздолбай и программист
Изучить C, изучить Lua. Потом взять и перевести в одного языка на другой.
Ответ написан
hash += (uint32)(*str);
берёт uint32 число по текущему указателю *str и аккумулирует его в переменной hash.

Битовые операторы
hash << 13
выполняет сдвиг влево на 13 бит (умножение hash на 2^13)

hash >> 19
выполняет сдвиг вправо на 19 бит (деление hash на 2^19)

(hash << 13) | (hash >> 19)
Побитовое ИЛИ от результата сдвигов выше

hash -= (hash << 13) | (hash >> 19);
обновление с вычитанием из аккумулированного значения hash
Ответ написан
@bromzh
Drugs-driven development
Можно взять и переписать код с C на Lua. Беда в том, что битовые операции в луа из коробки фиговые. Но есть эта библиотека (правда она вроде только для luajit).

Второй и более лучший вариант - использовать сишную библиотеку. Луа очень хорошо интегрируется с сишкой. Если берёшь обычную реализацию - можно написать сишный модуль для луа. Если luajit - то там FFI из коробки, достаточно дёргать сишные функции.
Ответ написан
Комментировать
@abcd0x00
Или хотя бы расскажите, что он делает.

1. Он добавляет 8-битное значение к 32-битному значению.
2. Затем берёт у этого 32-битного значения 13 бит слева и переставляет их направо.
3. Потом из исходного 32-битного значения вычитается полученное 32-битное значение.
4. Потом всё повторяется, пока есть 8-битные значения.

Если бы ты запустил это в дебаггере, то увидел бы по шагам, что происходит в цикле.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы