Как использовать Hashlib для MD5 хэш-числа? - PullRequest
0 голосов
/ 03 октября 2019

Кажется, все так делают:

import hashlib 

# initializing string 
str = "GeeksforGeeks"

# encoding GeeksforGeeks using encode() 
# then sending to md5() 
result = hashlib.md5(str.encode()) 

Однако я хочу хешировать простые числа. Что-то вроде

result = hashlib.md5(0) 
#or
var = 5
result = hashlib.md5(var)

не работает, и я пробовал множество других вариантов. Какой правильный синтаксис?

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Хэши работают с последовательностью байтов .

Целое число в Python - это просто логическое значение;он не имеет определенного размера или побайтного представления. Если вы хотите хешировать числа, вам нужно решить, в какую форму вводить число, прежде чем хешировать его.

Самый простой вариант - это хешировать строковое представление числа. Сделайте это, позвонив str и хэшируя результат. Например,

var = 5
hash_input = str(var)
result = hashlib.md5(hash_input)

Другой вариант - выбрать фиксированный размер и хэшировать двоичное представление числа:

var = 5
hash_input = struct.pack('<I', var)  # Little-endian 32-bit unsigned
result = hashlib.md5(hash_input)

Правильный способ сделать это полностью зависит от того, что именно выпытаемся выполнить то, что вы нам не сказали.

0 голосов
/ 03 октября 2019

Хеширование простых чисел, по меньшей мере, неоднозначно.
Число должно быть преобразовано в байты перед передачей в алгоритм дайджеста. Первая проблема, с которой вы столкнетесь, состоит в том, какой размер байта занимает число, может быть 4 байта, 8 байтов или что-то еще. Затем наступает порядок байтов в памяти. Все это приведет к разным дайджестам для, казалось бы, одного и того же числа. (Для простоты я предположил, что число равно int)

>>> hashlib.md5(b'4').hexdigest()
'a87ff679a2f3e71d9181a67b7542122c'
>>> i = 4
>>> hashlib.md5(i.to_bytes(2, 'big')).hexdigest()
'c244b9cdf7853b5693a295e384c07367'
>>> hashlib.md5(i.to_bytes(4, 'big')).hexdigest()
'ea4959eb64a1f09be580d950964f3843'
>>> hashlib.md5(i.to_bytes(8, 'big')).hexdigest()
'59cff542fae7e0c4267e45740a12c9a0'

Итак, ваше решение - преобразовать int в str и закодировать его, чтобы получить из него дайджест.

# either this
>>> hashlib.md5(b'4').hexdigest()
# or
>>> hashlib.md5(str(4).encode()).hexdigest()

Надеюсь, это поможет.

...