Нужна помощь с .join
Возникает ошибка в коде, помогите понять в чем дело.
Traceback (most recent call last):
File "/home/kali/Рабочий стол/main.py", line 40, in <module>
s = ' '.join(collisions[i])
KeyError: 0
Код:
from bitarray import bitarray
from bitarray.util import ba2int # pip install bitarray
def CRC(arg):
arg = format(arg, 'b') # Представляем входное сообщение битовой строкой
arg+= "00000" # Добавляем входному сообщению пять нулей, что соотв, домножению на x*5
bits = bitarray(arg) # Представляем как массив бит
for i in range(len(bits) - 5):
if bits[i] == 1:
bits[i] ^= 1 # Когда встречаем единицу в старшем разряде -
bits[i+3] ^= 1 # выполняем побитовый XOR в соответствии с G(x) = x°5 + x°2 + 1
bits[i+5] ^= 1
return ba2int(bits) # Возвращаем полученное значение функции целым числом
while True:
opt = int(input('''\n1) Получение значения хеш-фушкции CRC для входного сообщения (1 байт)
\n2) Поиск всех коллизий хеш-функции для всех аргументов (1 байт)
\n0) Выход
\nВыберите одну из предложенных опций: '''))
if opt == 0:
break
elif opt == 1:
arg = int(input("\nВведите целое число от 0 до 255: "))
f = CRC(arg)
print(f"\nВычисленное значение: {format(f, 'b')}")
elif opt == 2:
collisions = {} # Создаем словарь ключ - значение CRC функции, значение словаря - список аргументов
# при которых CRC функция принимает данное значение CRC
for i in range(256):
f = CRC(1)
if f in collisions:
collisions[f].append(str(i)) # Если такой ключ уже есть - добавляем в список аргумент
else:
collisions[f] = [str(i)] # Если нет - создаем список с аргументом
print("Значение хеш-функции\tАргументы при которых получается данное значение")
for i in range(32): # Т.к. x*5 - перебираем уже вычисленные значения функции от до 31
s = ' '.join(collisions[i])
print(f"\t{format(i, 'b')}\t\t{s}") # формируем строки и выводим
else:
print("\nОшибка ввода попробуйте еще раз: ")
Ответы (1 шт):
Автор решения: CrazyElf
→ Ссылка
for i in range(256):
f = CRC(1) # ОШИБКА! Аргумент функции - константа
Так вы не используете переменную цикла i и вычисляете CRC всегда от аргумента 1. Исправьте это и всё заработает как нужно:
for i in range(256):
f = CRC(i) # теперь правильно