Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Хеширование (Hash) в Python
Хеширование — это процесс преобразования данных любого размера в фиксированную последовательность символов (хеш-код). Это необратимая операция, которая используется для проверки целостности данных, безопасности и кэширования.
Основной принцип
Хеш-функция берёт на вход данные любого размера и выдаёт строку фиксированной длины (обычно в hex-формате):
Вход: "hello world" (11 байт)
Выход: "5eb63bbbe01eeed093cb22bb8f5acdc3" (32 символа, MD5)
Основные свойства:
- Детерминированность — одни и те же данные всегда дают один и тот же хеш
- Необратимость — невозможно восстановить исходные данные из хеша
- Чувствительность — малейшее изменение данных меняет хеш полностью
- Фиксированный размер — хеш имеет одинаковый размер для любых входных данных
Встроенная функция: hash()
Python имеет встроенную функцию hash() для хеширования объектов:
# Хешируем разные типы данных
print(hash("hello")) # 7066799254415871487 (может быть разным)
print(hash(42)) # 42
print(hash((1, 2, 3))) # примерно -8214826577968611565
print(hash(3.14)) # примерно 554519055655396683
# Одинаковые данные дают одинаковый хеш
print(hash("hello") == hash("hello")) # True
# Разные данные обычно дают разные хеши
print(hash("hello") == hash("world")) # False
Проблемы встроенного hash()
# 1. Случайность между запусками (для безопасности)
# Каждый запуск Python может дать разные хеши
print(hash("hello")) # запуск 1: 123456789
print(hash("hello")) # запуск 2: 987654321
# 2. Нельзя хешировать изменяемые объекты
print(hash([1, 2, 3])) # TypeError: unhashable type: 'list'
print(hash({"a": 1})) # TypeError: unhashable type: 'dict'
# 3. Можно хешировать только неизменяемые объекты
print(hash((1, 2, 3))) # OK, кортеж неизменяем
print(hash((1, [2], 3))) # TypeError, содержит список
Криптографические хеш-функции
Для реальных применений используй модуль hashlib (криптографические хеши):
MD5 (устаревший, НЕ использовать для безопасности)
import hashlib
text = "hello world"
md5_hash = hashlib.md5(text.encode()).hexdigest()
print(md5_hash) # 5eb63bbbe01eeed093cb22bb8f5acdc3
SHA-256 (современный, рекомендуется)
import hashlib
text = "hello world"
sha256_hash = hashlib.sha256(text.encode()).hexdigest()
print(sha256_hash) # b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
SHA-512
import hashlib
text = "hello world"
sha512_hash = hashlib.sha512(text.encode()).hexdigest()
print(sha512_hash) # 309ecc489c12d6eb4cc40f50c902f2b4d0ed77ee511a7c7a9bcd3ca86d4cd86f989dd35bc5ff499670da34255b45b0cfd830e81f605dcf7dc5542e93ae9cd76
Практические примеры
1. Проверка целостности файла
import hashlib
def file_hash(filepath, algorithm='sha256'):
"""Вычисляет хеш файла для проверки целостности"""
hash_obj = hashlib.new(algorithm)
with open(filepath, 'rb') as f:
# читаем блоками для экономии памяти
for chunk in iter(lambda: f.read(4096), b''):
hash_obj.update(chunk)
return hash_obj.hexdigest()
# Используем
original_hash = file_hash('/path/to/file.zip')
print(f"Хеш файла: {original_hash}")
# Позже проверяем, не изменился ли файл
new_hash = file_hash('/path/to/file.zip')
if original_hash == new_hash:
print("Файл не повреждён")
else:
print("Файл изменился!")
2. Хеширование паролей
import hashlib
import secrets
# НЕПРАВИЛЬНО: простое хеширование пароля
password = "mypassword"
hash_bad = hashlib.sha256(password.encode()).hexdigest()
# Это уязвимо для радужных таблиц!
# ПРАВИЛЬНО: используй bcrypt
from bcrypt import hashpw, gensalt, checkpw
password = "mypassword"
salt = gensalt()
hashed = hashpw(password.encode(), salt)
print(hashed) # b'$2b$12$...'
# Проверка пароля
if checkpw("mypassword".encode(), hashed):
print("Пароль верный")
3. Кэширование с хешами
import hashlib
def cached_expensive_function(data):
"""Функция, использующая хеш для кэширования"""
cache = {}
def compute(input_data):
# создаём ключ кэша на основе хеша данных
key = hashlib.sha256(str(input_data).encode()).hexdigest()
if key in cache:
return cache[key]
# дорогое вычисление
result = sum(range(1000000))
cache[key] = result
return result
return compute(data)
4. Словари (хеш-таблицы)
# Словари в Python используют хеширование
d = {'name': 'john', 'age': 30}
# Ключи должны быть хешируемыми (неизменяемыми)
print(d['name']) # быстро, O(1), благодаря хешированию
# Нельзя использовать списки как ключи
# d[[1, 2, 3]] = 'value' # TypeError
# Но можно использовать кортежи
d[(1, 2, 3)] = 'value' # OK
Сравнение хеш-алгоритмов
| Алгоритм | Размер | Скорость | Безопасность | Статус |
|---|---|---|---|---|
| MD5 | 128 бит | Быстрая | Сломана | Устаревший |
| SHA-1 | 160 бит | Быстрая | Слабая | Устаревший |
| SHA-256 | 256 бит | Хорошая | Сильная | Рекомендуется |
| SHA-512 | 512 бит | Хорошая | Очень сильная | Рекомендуется |
| bcrypt | N/A | Медленная | Очень сильная | Для паролей |
Лучшие практики
- Для безопасности: используй SHA-256 или SHA-512, не MD5
- Для паролей: используй bcrypt, argon2, не sha256
- Для проверки целостности: SHA-256 достаточно
- Добавляй соль: при хешировании паролей используй уникальную соль
- Знай разницу: hash() для внутреннего использования, hashlib для крипто
Хеширование — это фундаментальная техника в программировании для обеспечения безопасности и эффективности.