кредиты
Эта проблема возникла из @miles .
Создайте функцию, которая вычисляет хэш CRC32 входной строки. На входе будет ASCII-строка любой длины. Выводом будет хеш CRC32 этой входной строки.
объяснение
Алгоритм CRC32 и других CRC по сути одинаков, поэтому здесь будет продемонстрирован только CRC3.
Во-первых, у вас есть полином генератора, который на самом деле является 4-битным [n + 1] целым числом (в CRC32 будет 33-битным).
В этом примере генератор полинома есть 1101
.
Затем у вас будет строка для хеширования, которая в этом примере будет 00010010111100101011001101
.
00010010111100101011001101|000 (1) append three [n] "0"s
1101 (2) align with highest bit
00001000111100101011001101|000 (3) XOR (1) and (2)
1101 (4) align with highest bit
00000101111100101011001101|000 (5) XOR (3) and (4)
1101 (6) align with highest bit
00000011011100101011001101|000 (7) XOR (5) and (6)
1101 (8) align with highest bit
00000000001100101011001101|000 (9) XOR (7) and (8)
1101 (10) align with highest bit
00000000000001101011001101|000 (11) XOR (9) and (10)
1101 (12) align with highest bit
00000000000000000011001101|000 (13) XOR (11) and (12)
1101 (14) align with highest bit
00000000000000000000011101|000 (15) XOR (13) and (14)
1101 (16) align with highest bit
00000000000000000000000111|000 (17) XOR (15) and (16)
110 1 (18) align with highest bit
00000000000000000000000001|100 (19) XOR (17) and (18)
1 101 (20) align with highest bit
00000000000000000000000000|001 (21) XOR (19) and (20)
^--------REGION 1--------^ ^2^
Остаток, полученный в момент (21)
, когда область 1 равна нулю, то есть 001
будет результатом хэша CRC3.
Спекуляции
- Генераторный полином есть
0x104C11DB7
, или0b100000100110000010001110110110111
, или4374732215
. - Входные данные могут быть строкой или списком целых чисел или любым другим приемлемым форматом.
- Выход будет шестнадцатеричная строка или просто целое число, или любой другой разумный формат.
- Встроенные модули, которые вычисляют хэш CRC32, не допускаются.
Цель
Стандартные правила для кода-гольфа применяются.
Самый короткий код выигрывает.
Контрольные примеры
input output (hex)
"code-golf" 147743960 08CE64D8
"jelly" 1699969158 65537886
"" 0 00000000
Ответы:
Intel x86,
34302927 байтБерет адрес строки с нулевым символом в ESI и возвращает CRC в EBX:
Разборка (AT & T синтаксис):
Включая предложения от Питера Кордеса, чтобы сохранить еще четыре байта. Это предполагает соглашение о вызовах, при котором флаг направления для строковых инструкций очищается при вводе.
Включение предложение Питера Ферри использовать кнопочный буквальным и поп загрузить константу, сохраняя один байт.
Включение предложения Питера Ферри , чтобы перейти ко второму байту в
xorl %eax, %ebx
инструкции , которая являетсяretl
инструкцией, в сочетании с изменением интерфейса подпрограммы взять завершаются нулем строки вместо длины, сохраняя два байта в общей сложности.источник
cld
insn (как я сделал в моем ответе adler32 ). Является ли нормальная практика разрешать совершенно произвольные соглашения о вызовах для ответов asm?edi
и указательesi
(возможно, не с расширением нуля, так что, возможно, вычеркните вещи и потребуйте 64-битный нулевой расширенный указатель). (x32, так что вы можете безопасно использовать 32-битную указательную математику, но при этом иметь соглашение о вызовах register-args. Поскольку вы не используетеinc
, нет недостатка в длинном режиме.)edx
в порядке в обратном порядке?bswap edx
только 2B.shr %edx
2B, так же, как ваш левый сдвиг сadd %edx,%edx
. Это, вероятно, не полезно; Если это не обеспечивает более оптимизацию, вы сохраняете 3B дляshl $24, %eax
, но вы тратите 4B дляxor %eax,%eax
начала иbswap %edx
в конце. Обнуление eax позволяет использоватьcdq
ноль%edx
, так что в целом это мытье. Тем не менее, он будет работать лучше: он предотвращает частичное или медленное торможение при каждой итерации при записиal
и последующем чтенииeax
с помощью shl. : PЖеле, 34 байта
Попробуйте онлайн!
источник
Рубин, 142 байта
Анонимная функция; принимает строку в качестве входных данных, возвращает целое число.
источник
Желе , 23 байта
Ввод в форме списка целых чисел. Попробуйте онлайн! или проверьте все контрольные примеры .
Как это устроено
В то время как у Jelly есть битовое XOR, заполнение ввода нулями и выравнивание полинома с наиболее значимой двоичной цифрой делает этот подход, который использует списки битов, немного короче.
источник
Pyth, 42 байта
Тестирование.
источник
CJam,
3736 байтПроверьте это здесь.
объяснение
источник
q256bYb_,{(4374732215Ybf*1>.^}*Yb
сохраняет несколько байтов.Pyth, 28 байт
Попробуйте онлайн: демонстрация или тестовый набор
Объяснение:
источник
JavaScript (ES6), 180 байт
Отсутствие 33-битного оператора XOR или даже беззнакового 32-битного оператора XOR бесполезно.
источник
CJam, 33 байта
Ввод в форме строки. Попробуйте онлайн!
Как это устроено
источник