CRC32 целочисленный хеш для строки

Я искал Lua-реализацию CRC32 и наткнулся на это: https://github.com/openresty/lua-nginx-module/blob/master/t/lib/CRC32.lua

Однако он возвращает целочисленный хэш, как мне получить его строковый эквивалент?

Используя ввод "что-то", он возвращает: 1850105976

Используя онлайн-генератор CRC32, я получаю: "879fb991"


person user1826176    schedule 20.11.2016    source источник
comment
Должно быть 09DA31FB   -  person Egor Skriptunoff    schedule 20.11.2016
comment
Существует как минимум 9 различных сумм CRC32.   -  person Egor Skriptunoff    schedule 20.11.2016
comment
Понятно, но это не совсем ответ на мой вопрос   -  person user1826176    schedule 20.11.2016


Ответы (1)


Есть много алгоритмов CRC-32. Вы можете найти десять различных CRC-32, задокументированных в этом каталоге. Код Lua, который вы нашли, и онлайн-код CRC32, который вы нашли (где-то - ссылка не была предоставлена), - это разные CRC-32.

Под «строковым эквивалентом» вы, кажется, подразумеваете шестнадцатеричное представление 32-битного целого числа. В Lua вы можете использовать string.format с форматом печати %x для получения шестнадцатеричного числа. В приведенном вами примере 1850105976 это будет 6e466078.

Ваш «онлайн-генератор CRC32», похоже, использует BZIP2 CRC-32, хотя он показывает вам байты результирующего CRC в обратном порядке (с прямым порядком байтов). Таким образом, фактическая CRC в этом случае в шестнадцатеричном формате равна 91b99f87. Код Lua, который вы нашли, похоже, использует MPEG-2 CRC-32. Единственная разница между ними - эксклюзивное или с ffffffff. Так что фактически исключающее ИЛИ из двух CRC, полученных из двух разных источников, 6e466078 ^ 91b99f87 равно ffffffff.

person Mark Adler    schedule 20.11.2016
comment
Большое спасибо, Марк! - person user1826176; 20.11.2016
comment
@ user1826176 Вы также можете попробовать: github.com/hjelmeland/luacrc32 (доступно через luarocks по адресу luarocks.org/modules/hjelmeland/crc32) - person hjpotter92; 20.11.2016
comment
@ hjpotter92 Этот выглядит намного лучше. Это более стандартный PKZip / ITU v.42 CRC-32, и реализация, похоже, использует реальные битовые операции (сдвиги и исключающее ИЛИ) в отличие от очень медленных реализаций с арифметикой в ​​коде, связанном в вопросе. - person Mark Adler; 20.11.2016