Я пытаюсь CRC16/32
контрольной суммы с binascii.crc32
, binacsii.crc_hqx
Python binascii.crc32, похоже, не работает должным образом
Это ценности, которые я использовал в качестве примера (я получил этот пример значения из некоторые спецификации протокола сети Читаю) ,
CRC 16
вход (в ASCII-строки): 123456789
семян: 0х0000
хеш-результата: 0x31c3
CRC 32
вход (как ASCII): 123456789
семян: 0x00000000
результат хеширования: 0xd202d277
Ниже мой тестовый код с выше контрольных значений.
>>> import binascii
>>> hex(binascii.crc_hqx("123456789", 0x0000))
'0x31c3' #corret result, same as test value result
>>> hex(binascii.crc32("123456789", 0x00000000) & 0xFFFFFFFF)
'0xcbf43926L'#Wrong result, different value from test value result, It Must be 0xd202d277
В чем проблема ...?
На самом деле я нашел это предложение в Python документ Since the algorithm is designed for use as a checksum algorithm, it is not suitable for use as a general hash algorithm.
Означает ли это, я не могу использовать его для CRC32 контрольной суммы?
Если да, есть ли рекомендации?
---------------------- Редактировать ----------------------
Я сам не делал тестовые значения.
Я только что получил значения из документа, объясняющего CRC32.
Ниже приводится таблица I ссылка
---------------------- Редактировать -------- --------------
В документе, содержащем таблицу рисунков, описывается G2S_crc, как показано ниже.
The CRC-32 polynomial defined for G2S can be described as follows:
x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
It is also represented as 0x04C11DB7. This polynomial is also used by IEEE 802.3.
.
function crc(bit array bitString[1..len], int polynomial)
{
shiftRegister := initial value // either the seed or all 1 bits
for i from 1 to len
{
if most significant bit of shiftRegister = 1
{
// Shift left, place data bit as LSB, then divide
shiftRegister := shiftRegister left shift 1
shiftRegister := shiftRegister or bitString[i]
shiftRegister := shiftRegister xor polynomial
}
else
{
// shiftRegister is not divisible by polynomial yet.
// Just shift left and bring current data bit onto LSB of shiftRegister
shiftRegister := shiftRegister left shift 1
shiftRegister := shiftRegister or bitString[i]
}
}
return shiftRegister
}
Отличается от binascii
?
Нет, это означает, что он предназначен для контрольной суммы, а не для общего алгоритма хэширования ... ergo вы должны использовать его только как контрольную сумму ... почему вы думаете, что это неправильный результат? –
@ Joran Beasley По моим тестовым значениям, я думаю, что это должно быть '0xd202d277' не' 0xcbf43926' – SangminKim
почему вы думаете, что 0xd292d277 - правильный ответ, а не 0xcbf42926 –