← Назад к вопросам

Что такое Нash?

1.0 Junior🔥 201 комментариев
#Python Core#Безопасность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Хеширование (Hash) в Python

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

Основной принцип

Хеш-функция берёт на вход данные любого размера и выдаёт строку фиксированной длины (обычно в hex-формате):

Вход: "hello world" (11 байт)
Выход: "5eb63bbbe01eeed093cb22bb8f5acdc3" (32 символа, MD5)

Основные свойства:

  1. Детерминированность — одни и те же данные всегда дают один и тот же хеш
  2. Необратимость — невозможно восстановить исходные данные из хеша
  3. Чувствительность — малейшее изменение данных меняет хеш полностью
  4. Фиксированный размер — хеш имеет одинаковый размер для любых входных данных

Встроенная функция: 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

Сравнение хеш-алгоритмов

АлгоритмРазмерСкоростьБезопасностьСтатус
MD5128 битБыстраяСломанаУстаревший
SHA-1160 битБыстраяСлабаяУстаревший
SHA-256256 битХорошаяСильнаяРекомендуется
SHA-512512 битХорошаяОчень сильнаяРекомендуется
bcryptN/AМедленнаяОчень сильнаяДля паролей

Лучшие практики

  1. Для безопасности: используй SHA-256 или SHA-512, не MD5
  2. Для паролей: используй bcrypt, argon2, не sha256
  3. Для проверки целостности: SHA-256 достаточно
  4. Добавляй соль: при хешировании паролей используй уникальную соль
  5. Знай разницу: hash() для внутреннего использования, hashlib для крипто

Хеширование — это фундаментальная техника в программировании для обеспечения безопасности и эффективности.

Что такое Нash? | PrepBro