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

Хеш-функции и их применение

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

10.1 Введение в хеш-функции и хеш-таблицы

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

  • Детерминированность: одинаковые входные данные всегда дают одинаковый результат.
  • Быстрое вычисление: хеш должен рассчитываться достаточно быстро.
  • Необратимость (для криптографических хеш-функций): из хеша невозможно (или крайне сложно) восстановить исходные данные.
  • Равномерное распределение: небольшие изменения во входных данных приводят к значительным изменениям в хеше.

Если упростить, эта функция у одинаковых объектов обязательно совпадает, но если хеш-функция у двух объектов одинакова, то эти объекты не обязательно равны. В математике это называется необходимым, но недостаточным условием.

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

  • Массива "корзин" для хранения данных.
  • Хеш-функции, которая определяет, в какую корзину поместить данные.

Хеш-таблицы обеспечивают быстрый доступ к данным, обычно со сложностью O(1) в среднем случае.

Применение хеш-функций в реальной жизни

Пример: Блокчейн-технологии

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


import hashlib
import time

class Block:
    def __init__(self, data, previous_hash):
        self.timestamp = time.time()
        self.data = data
        self.previous_hash = previous_hash
        self.hash = self.calculate_hash()

    def calculate_hash(self):
        hash_string = str(self.timestamp) + str(self.data) + str(self.previous_hash)
        return hashlib.sha256(hash_string.encode()).hexdigest()

# Пример использования
block1 = Block("Транзакция 1", "0")
block2 = Block("Транзакция 2", block1.hash)
print(f"Хеш блока 1: {block1.hash}")
print(f"Хеш блока 2: {block2.hash}")

Сравнение производительности

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


import time

def find_duplicates_with_hash(arr):
    seen = set()
    duplicates = []
    for item in arr:
        if item in seen:
            duplicates.append(item)
        else:
            seen.add(item)
    return duplicates

def find_duplicates_without_hash(arr):
    duplicates = []
    for i in range(len(arr)):
        for j in range(i+1, len(arr)):
            if arr[i] == arr[j] and arr[i] not in duplicates:
                duplicates.append(arr[i])
    return duplicates

# Тест производительности
arr = list(range(10000)) + list(range(5000))  # Массив с дубликатами

start = time.time()
find_duplicates_with_hash(arr)
end = time.time()
print(f"Время выполнения с хеш-таблицей: {end - start} секунд")

start = time.time()
find_duplicates_without_hash(arr)
end = time.time()
print(f"Время выполнения без хеш-таблицы: {end - start} секунд")

Запустите программу и убедитесь, насколько использование хеш-таблицы ускоряет поиск дубликатов. Особенно на больших массивах данных.

10.2 Примеры применения хеш-функций в реальных задачах

1. Хеширование паролей

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

Пример реализации:


import hashlib

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

# Пример использования:
password = "securepassword"
hashed_password = hash_password(password)
print(f"Хеш пароля: {hashed_password}")

2. Контроль целостности данных

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

Пример реализации:


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. Поисковые системы и индексация

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

Пример реализации:


def create_index(text):
    index = {}
    words = text.split()
    for word in words:
        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}")

10.3 Оптимизация поиска с использованием хеш-функций

1. Использование хеш-таблиц для поиска дубликатов

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

Пример реализации:


def find_duplicates(arr):
    seen = set()
    duplicates = []
    for item in arr:
        if item in seen:
            duplicates.append(item)
        else:
            seen.add(item)
    return duplicates

# Пример использования:
arr = [1, 2, 3, 2, 4, 5, 6, 4, 7]
print(find_duplicates(arr))  # Вывод: [2, 4]

2. Оптимизация поиска пар с заданной суммой

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

Пример реализации:


def find_pairs_with_sum(arr, target_sum):
    seen = set()
    pairs = []

    for num in arr:
        complement = target_sum - num
        if complement in seen:
            pairs.append((complement, num))
        seen.add(num)

    return pairs

# Пример использования:
arr = [2, 4, 3, 7, 8, -2, 10, -1]
target_sum = 6
print(find_pairs_with_sum(arr, target_sum))  # Вывод: [(4, 2), (3, 3), (8, -2)]

10.4 Примеры использования хеш-функций в различных алгоритмах

1. Подсчёт количества слов в тексте

Используйте хеш-таблицу для подсчёта количества вхождений каждого слова в тексте.

Пример реализации:


def count_words(text):
    word_count = {}
    words = text.split()

    for word in words:
        if word in word_count:
            word_count[word] += 1
        else:
            word_count[word] = 1

    return word_count

# Пример использования:
text = "this is a test this is only a test"
print(count_words(text))  # Вывод: {'this': 2, 'is': 2, 'a': 2, 'test': 2, 'only': 1}

2. Проверка пересечения двух массивов

Проверьте, пересекаются ли два массива (имеют ли они хотя бы один общий элемент).

Пример реализации:


def has_intersection(arr1, arr2):
    set1 = set(arr1)
    for item in arr2:
        if item in set1:
            return True
    return False

# Пример использования:
arr1 = [1, 2, 3, 4]
arr2 = [3, 5, 6, 7]
arr3 = [8, 9, 10]
print(has_intersection(arr1, arr2))  # Вывод: True
print(has_intersection(arr1, arr3))  # Вывод: False

3. Проверка уникальности элементов в массиве

Проверьте, содержатся ли в массиве только уникальные элементы.

Пример реализации:


def all_unique(arr):
    seen = set()
    for item in arr:
        if item in seen:
            return False
        seen.add(item)
    return True

# Пример использования:
arr1 = [1, 2, 3, 4, 5]
arr2 = [1, 2, 3, 4, 5, 3]
print(all_unique(arr1))  # Вывод: True
print(all_unique(arr2))  # Вывод: False
2
Задача
Модуль 1: Python Core, 16 уровень, 9 лекция
Недоступна
Хеширование паролей
Хеширование паролей
2
Задача
Модуль 1: Python Core, 16 уровень, 9 лекция
Недоступна
Авторизация
Авторизация
1
Опрос
Хэширование, 16 уровень, 9 лекция
Недоступен
Хэширование
Хэширование
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ