Ключевое различие в обратимости.
Сериализация - двусторонний процесс. Берешь объект, превращаешь в JSON/XML/protobuf, передаешь куда надо, на другом конце десериализуешь обратно в точно такой же объект. Ничего не теряется.
import json
obj = {"name": "Ivan", "age": 25}
serialized = json.dumps(obj) # '{"name": "Ivan", "age": 25}'
original = json.loads(serialized) # {"name": "Ivan", "age": 25}
Хеширование - односторонний процесс. Берешь данные любого размера, получаешь строку фиксированной длины. Восстановить исходные данные из хеша невозможно (если хеш криптостойкий). Плюс разные входные данные могут дать одинаковый хеш (коллизии).
import hashlib
data = "любой текст любой длины"
hash_value = hashlib.sha256(data.encode()).hexdigest()
# '3a7bd3e2...' - всегда 64 символа для SHA-256
# из этой строки исходный текст не восстановить
Когда что:
- Сериализация: передача данных между сервисами, сохранение состояния, кеширование объектов
- Хеширование: хранение паролей, проверка целостности файлов, дедупликация, хеш-таблицы
Спасибо, теперь понятно. Обратимость - вот ключевое слово которое я искал