Это невозможно.
Хеш - это не сжатая версия исходного значения, это число (или нечто подобное) , полученное из исходного значения.Природа реализации хеш-функции заключается в том, что возможно (но статистически маловероятно, если алгоритм хеширования является хорошим), что два разных объекта выдают одинаковое значение хеш-функции.
Это известно как принцип 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 или аналогичного алгоритма безопасного шифрования
- Сериализация / десериализация, код, созданный для получения сложной иерархии объектов и создания двоичного или текстового представления, которое впоследствии можно десериализовать обратно в новые объекты