JavaRush /Курсы /Модуль 1: Python Core /Понятие хеш-функции

Понятие хеш-функции

Модуль 1: Python Core
16 уровень , 4 лекция
Открыта

5.1 Определение хеш-функции и её применение

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

Определение хеш-функции и её применение

Применение:

  • Хеш-таблицы: Используются для реализации ассоциативных массивов (словари в Python), обеспечивая быстрый доступ к данным по ключу.
  • Контроль целостности данных: Хеш-функции применяются для проверки целостности файлов и данных (например, алгоритмы MD5, SHA-1, SHA-256).
  • Криптография: Хеш-функции используются в криптографических алгоритмах для шифрования и создания цифровых подписей.
  • Поисковые системы: Применяются для индексации данных и быстрого поиска информации.
  • Управление кэшем: Используются для организации кэшей, чтобы быстро находить данные.

Пример применения хеш-функции в Python:


# Пример использования хеш-функции в Python для хеш-таблицы (словаря)
data = {"apple": 1, "banana": 2, "cherry": 3}

# Получение хеш-значения ключа
key = "banana"
hash_value = hash(key)

print(f"Хеш-значение для ключа '{key}': {hash_value}")

5.2 Аналогии из реальной жизни

С помощью хеш-функции можно разбить большую группу объектов на примерно равные группы. Более того, если продолжить добавлять новые объекты, то они продолжат равномерно распределяться по группам.

Допустим, у вас есть 1000 человек, и вам нужно распределить их по 30 группам. Вот как это можно сделать.

Способ 1. По первой букве имени.

Первая группа — это все, у кого имя на «А», вторая группа — это все, у кого имя на «Б», и так далее. Правило «Твоя группа — это первая буква твоего имени» — это и есть хеш-функция. Но с такой хеш-функцией мы рискуем получить много людей в группе «А» и мало в «Э».

Способ 2. По дате рождения.

Родился первого числа любого месяца — первая группа, второго — вторая, и так далее. Будет 31 группа. В 31-й группе людей будет где-то в 2 раза меньше, чем в остальных, но люди в таких группах гораздо более равномерно распределены, чем в первом случае.

Способ 3. Номер телефона

Идеальный вариант — это получить такое число, которое было бы, с одной стороны, максимально случайным (тогда такие числа будут равномерно распределены), с другой — оно должно всегда быстро вычисляться и быть одним и тем же.

Давайте возьмём 4 последних цифры номера телефона — это будет 10 000 вариантов. А затем поделим это число нацело на 30. Тогда у нас будет 30 возможных остатков от деления: 0, 1, 2, ..., 29. Это и будут номера наших групп.

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

5.3 Основные свойства хеш-функции

Основные свойства хорошей хеш-функции:

Детерминированность: Одна и та же хеш-функция всегда должна возвращать одно и то же хеш-значение для одного и того же входного значения.

Пример:


key = "example"
assert hash(key) == hash(key)

Важно! Оператор assert проверяет, что справа от него находится истинное True выражение. Если выражение не истинно False, то будет выброшено исключение.

Равномерность: Хорошая хеш-функция должна равномерно распределять значения по всему диапазону возможных хеш-значений, чтобы избежать коллизий.

Пример из жизни Python-разработчика: В словаре (класс dict) Python хеш-функция hash() распределяет ключи равномерно.

Эффективность вычисления: Хеш-функция должна быть быстрой и эффективной, чтобы не замедлять операции вставки и поиска.

Пример из жизни Python-разработчика: Стандартные хеш-функции в Python реализованы для работы с ключами различных типов, таких как строки и числа.

Минимизация коллизий: Коллизия происходит, когда два разных ключа имеют одинаковое хеш-значение. Хорошая хеш-функция должна минимизировать вероятность коллизий.

Пример из жизни Python-разработчика: Алгоритм SHA-256 минимизирует вероятность коллизий при хешировании данных.

Распределение хешей: Для больших объёмов данных хеш-функция должна обеспечивать равномерное распределение хеш-значений по всей хеш-таблице.

Пример из жизни Python-разработчика: Стандартные хеш-функции в Python хорошо справляются с распределением ключей в хеш-таблицах.

5.4 Примеры хеш-функций и их реализация

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

Пример 1: Простая хеш-функция для строк

Одна из самых простых хеш-функций для строк может быть реализована с использованием суммы кодов символов строки:


def simple_hash(key):
    hash_value = 0
    for char in key:
        hash_value += ord(char)
    return hash_value % 1000  # Предположим, что наша таблица имеет размер 1000

# Пример использования:
key = "example"
print(f"Хеш-значение для ключа '{key}': {simple_hash(key)}")

Пример 2: Хеш-функция для строк с использованием полиномиального хеширования

Полиномиальное хеширование является более сложной, но эффективной техникой:


def polynomial_hash(key, a=33, m=1000):
    hash_value = 0
    for char in key:
        hash_value = (hash_value * a + ord(char)) % m
    return hash_value

# Пример использования:
key = "example"
print(f"Хеш-значение для ключа '{key}': {polynomial_hash(key)}")

Пример 3: Встроенная хеш-функция в Python

Python предоставляет встроенную функцию hash() для получения хеш-значения для различных типов данных:


key = "example"
print(f"Хеш-значение для ключа '{key}': {hash(key)}")

Пример 4: Криптографическая хеш-функция (SHA-256)

Криптографические хеш-функции, такие как SHA-256, используются для обеспечения безопасности данных:


import hashlib

def sha256_hash(key):
    return hashlib.sha256(key.encode()).hexdigest()

# Пример использования:
key = "example"
print(f"Хеш-значение для ключа '{key}': {sha256_hash(key)}")

5.5 Введение в хеширование и его применение

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

Основные применения хеширования:

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


data = {"apple": 1, "banana": 2, "cherry": 3}
key = "banana"
hash_value = hash(key)
print(f"Хеш-значение для ключа '{key}': {hash_value}")

2. Контроль целостности данных: Хеш-функции используются для проверки целостности файлов и данных.

Пример: Проверка целостности файла с использованием SHA-256:


import hashlib

def get_file_hash(file_path):
    hasher = hashlib.sha256()
    with open(file_path, 'rb') as file:
        buf = file.read()
        hasher.update(buf)
    return hasher.hexdigest()

file_hash = get_file_hash('example.txt')
print(f"SHA-256 хеш файла: {file_hash}")

3. Криптография и безопасность: Хеш-функции используются для создания криптографических примитивов, таких как цифровые подписи и хеши паролей.

Пример: Хеширование пароля с использованием SHA-256:


import hashlib

def hash_password(password):
    return hashlib.sha256(password.encode()).hexdigest()

password = "securepassword"
hashed_password = hash_password(password)
print(f"Хеш пароля: {hashed_password}")

4. Поисковые системы и индексация: Хеширование применяется для создания индексов и быстрого поиска данных.

Пример: Создание индекса для текстового поиска:


def create_index(text):
    index = {}
    for word in text.split():
        word_hash = hash(word)
        if word_hash not in index:
            index[word_hash] = []
        index[word_hash].append(word)
    return index

text = "This is an example text for indexing"
index = create_index(text)
print(f"Индекс: {index}")

5. Управление кэшем: Хеширование используется для организации кэшей, чтобы быстро находить данные.

Пример: Простой кэш с использованием хеш-функции:


cache = {}

def get_from_cache(key):
    hash_key = hash(key)
    return cache.get(hash_key, None)

def add_to_cache(key, value):
    hash_key = hash(key)
    cache[hash_key] = value

# Добавление и получение данных из кэша
add_to_cache("test_key", "test_value")
print(get_from_cache("test_key"))  # Вывод: test_value
2
Задача
Модуль 1: Python Core, 16 уровень, 4 лекция
Недоступна
Хеш-функция
Хеш-функция
2
Задача
Модуль 1: Python Core, 16 уровень, 4 лекция
Недоступна
Хеш-функция для словаря
Хеш-функция для словаря
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Long_byte Уровень 60
14 января 2026
а как будет сохранять значение если произойдет коллизия?
Edf Уровень 64
27 марта 2025
Давайте возьмём 4 последних цифры номера телефона — это будет 10 000 вариантов. А затем поделим это число нацело на 30. Тогда у нас будет 30 возможных остатков от деления: 0, 1, 2, ..., 29. Это и будут номера наших групп.- Серьезно?
Slevin Уровень 59
9 августа 2025
Ну типа да, остаток от деления это не цифры после запятой, а целое число в диапазоне [0, 29]