Unhash значение Python - PullRequest
       30

Unhash значение Python

6 голосов
/ 09 июня 2010

Я новичок в питоне.Могу ли я распаковать, или, вернее, как я могу распаковать значение?Я использую функцию std hash ().То, что я хотел бы сделать, это сначала хэшировать значение, отправлять его куда-нибудь, а затем распаковывать его так:

#process X
hashedVal = hash(someVal)
#send n receive in process Y
someVal = unhash(hashedVal)
#for example print it
print someVal

Спасибо заранее

Ответы [ 4 ]

24 голосов
/ 09 июня 2010

Это невозможно.

Хеш - это не сжатая версия исходного значения, это число (или нечто подобное) , полученное из исходного значения.Природа реализации хеш-функции заключается в том, что возможно (но статистически маловероятно, если алгоритм хеширования является хорошим), что два разных объекта выдают одинаковое значение хеш-функции.

Это известно как принцип Pigeonhole , который в основном гласит, что если у вас есть N разных предметов и вы хотите поместить их в M разных категорий, где число N больше, чем M (то есть больше предметов, чем категорий), вы получите несколько категорийсодержащий несколько предметов.Поскольку хэш-значение обычно намного меньше по размеру, чем хешируемые данные, оно следует тем же принципам.

Таким образом, невозможно вернуться назад, если у вас есть хеш-значение.Вам нужен другой способ передачи данных, чем этот.

Например, пример (но не очень хороший) хеш-алгоритма будет вычислять модуль чисел 3 (т. Е. Остаток после деления на 3),Тогда у вас будут следующие хеш-значения из чисел:

1 --> 1  <--+- same hash number, but different original values
2 --> 2     |
3 --> 0     |
4 --> 1  <--+

Пытаетесь ли вы использовать хеш-функцию таким образом, чтобы:

  • Экономия места (вы наблюдаличто значение хеша намного меньше по размеру, чем исходные данные)
  • Безопасная транспортировка (вы заметили, что значение хеша трудно перевернуть)
  • Транспортные данные (вы заметили, что хешчисло / строку легче переносить, чем сложную иерархию объектов)

...?

Знание того, почему вы хотите это сделать, может дать вам лучший ответ, чем просто " это не может быть сделано".

Например, для вышеупомянутых 3 различных наблюдений, вот способ сделать каждое из них должным образом:

  • Сжатие / Декомпрессиянапример, с использованием gzip или zlib (два из них обычно доступны в большинстве языков программирования / сред выполнения)
  • Шифрование / дешифрование, например с использованием RSA, AES или аналогичного алгоритма безопасного шифрования
  • Сериализация / десериализация, код, созданный для получения сложной иерархии объектов и создания двоичного или текстового представления, которое впоследствии можно десериализовать обратно в новые объекты
5 голосов
/ 22 мая 2018

Даже если я опаздываю с ответом почти на 8 лет, я хочу сказать, возможно отменить хеширование данных (но не с помощью функции std hash()).

Все предыдущие ответы описывают криптографические хеш-функции , которые по замыслу должны вычислять невозможные хеши (или, по крайней мере, очень трудно хешировать).

Однако это не относится ко всем хеш-функциям.

Решение

Вы можете использовать basehash python lib (pip install basehash)чтобы достичь того, чего вы хотите.

Однако следует помнить одну важную вещь: чтобы иметь возможность хэшировать данные, вам нужно хэшировать их без потери данных.Как правило, это означает, что чем больше пул типов данных и значений вы хотите хэшировать, тем больше должна быть длина хеша, чтобы избежать коллизий хешей.

В любом случае, вот простой примерКак хэшировать / хэшировать данные:

import basehash

hash_fn = basehash.base36()  # you can initialize a 36, 52, 56, 58, 62 and 94 base fn
hash_value = hash_fn.hash(1) # returns 'M8YZRZ'
unhashed = hash_fn.unhash('M8YZRZ') # returns 1

Вы можете определить длину хеш-функции при инициализации хеш-функции, а также хешировать другие типы данных.

Я опускаю объяснение необходимости различных основ и длин хеша для читателей, которые хотели бы узнать больше о хешировании.

5 голосов
/ 09 июня 2010

Вы не можете «разархивировать» данные, хеш-функции необратимы из-за принципа «голубиных отверстий»

http://en.wikipedia.org/wiki/Hash_function
http://en.wikipedia.org/wiki/Pigeonhole_principle

Я думаю, что вы ищете шифрование/ дешифрования.(Или сжатие или сериализация, как упомянуто в других ответах / комментариях.)

0 голосов
/ 09 июня 2010

Это вообще невозможно.Хеш-функция обязательно теряет информацию, и Python hash не является исключением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...