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

 Наглядная схема хэширования данных.
Наглядная схема хэширования данных.

Хэширование – это процесс преобразования данных в уникальный фиксированный строковый идентификатор, называемый хэшем. Хэш-функции, такие как MD5SHA-1 и SHA-256, применяют определенные алгоритмы к входным данным и генерируют строку фиксированной длины. Эти функции имеют множество полезных свойств: они детерминированы (одинаковые входные данные всегда дают одинаковый хэш), быстры и трудно обратимы (невозможно восстановить исходные данные по хэшу). Эти свойства делают хэширование идеальным инструментом для различных задач, включая оптимизацию хранилища данных.

Пример такого преобразования:

import hashlib

# Пример строки
example_string = "Hello, World!"

# MD5
md5_hash = hashlib.md5(example_string.encode()).hexdigest()
print(f"MD5: {md5_hash}")

# SHA-1
sha1_hash = hashlib.sha1(example_string.encode()).hexdigest()
print(f"SHA-1: {sha1_hash}")

# SHA-256
sha256_hash = hashlib.sha256(example_string.encode()).hexdigest()
print(f"SHA-256: {sha256_hash}")

В результате получим:

$ py hashing_example.py 
MD5: 65a8e27d8879283831b664bd8b7f0ad4
SHA-1: 0a0a9f2a6772942557ab5355d76af442f8f65e01
SHA-256: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f

Хэширование файлов

Одним из наиболее интересных и доступных способов оптимизации хранилища является хэширование файлов. Процесс хэширования файлов преобразует данные файла в уникальный строковый идентификатор. Это даёт следующие преимущества:

  1. Исключение дубликатов
    Хэширование позволяет легко определить, являются ли два файла одинаковыми. Если два файла имеют один и тот же хэш, они идентичны. Это помогает избежать хранения дубликатов и экономить пространство.

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

  3. Ускорение резервного копирования и восстановления данных
    При резервном копировании данных использование хэшей помогает определить измененные файлы. Это позволяет копировать только измененные или новые файлы, что ускоряет процесс резервного копирования.

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

Реализация

Реализовать хэширование файлов очень просто. Вот наглядный пример Реализации хэширования файлов на Python с использованием библиотеки hashlib:

import hashlib


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


file_path = 'example_file.txt'
file_hash = get_file_hash(file_path)
print(f'Hash for {file_path}: {file_hash}')

Этот код вычисляет SHA-256 хэш для указанного файла, по которому этот файл можно однозначно идентифицировать. Аналогичные функции можно реализовать и на других языках программирования.

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

Art by DALL·E 3
Art by DALL·E 3

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

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

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


  1. Ukrainskiy
    12.06.2024 19:52
    +8

    И так в очередной раз мы можем убедиться, что писать статьи при помощи ChatGPT плохая идея.


    1. aamonster
      12.06.2024 19:52

      Вы можете отличить ChatGPT от копирайтера?


      1. Wesha
        12.06.2024 19:52
        +6

        Да, отличить ChatGPT от просто начитавшегося дурака достаточно непросто.


    1. alexdora
      12.06.2024 19:52

      У меня один вопрос к ребятам кто юзает чатгпт для технических статей. Почему еще никто не додумался после описания задачи добавлять в конце «напиши мне в стиле тарантино или типа того». Было бы интересно почитать техничку в таком формате ;)


      1. Wesha
        12.06.2024 19:52

        Вот когда оно научися писать статьи слогом @Milfgard...


  1. OverThink
    12.06.2024 19:52
    +1

    Лучше по имени файла/размер сверю, чем буду пол дня хэш вычислять


    1. David_Osipov
      12.06.2024 19:52
      +1

      xxHash, ну или крипто-хэш BLAKE3 ужасно быстрые.


  1. Maksim_Fokin
    12.06.2024 19:52
    +4

    Исключение дубликатов
    Хеширование позволяет легко определить, являются ли два файла одинаковыми. Если два файла имеют один и тот же хеш, они идентичны. Это помогает избежать хранения дубликатов и экономить пространство.

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


    1. meliksetyan Автор
      12.06.2024 19:52

      Да, это справедливое замечание, я тоже об этом думал. Мы можем легко это законтрить сравнивая метаданные файлов: например, размер. Либо можно делать 2 хеша двумя разными алгоритмами.


      1. pfffffffffffff
        12.06.2024 19:52

        Это не спасет от коллизий


        1. JajaComp
          12.06.2024 19:52

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


          1. select26
            12.06.2024 19:52

            Никакой хэш размерностью меньше хэшируемого объекта не спасет. Сведет к минимуму вероятность коллизии - да. Но не исключит её.


            1. Ukrainskiy
              12.06.2024 19:52

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


              1. select26
                12.06.2024 19:52

                Я именно это и написал.
                Более того, большинство решений на рынке - это дедупликация на уровне блочных устройств, а не файлов. По причине того, что размер блока сильно меньше размера среднего файла, то вероятность коллизии так же значительно уменьшается.
                Если не ошибаюсь, только Windows Servers предлагает дедуп на уровне файлов. И как они решают с коллизиями я не знаю.
                Нужно очень хорошо понимать профиль своих данных перед принятием решения о применении дедупликации


  1. ivankudryavtsev
    12.06.2024 19:52

    Просто меняем хранение на дисках на вычисления и хранение в памяти. Дедупликацией в Zfs не сказать что много людей пользуется:

    And from the ZFS manual page zfsconcepts ; It is generally recommended that you have at least 1.25 GiB of RAM per 1 TiB of storage when you enable deduplication. Calculating the exact requirement depends heavily on the type of data stored in the pool.


    1. select26
      12.06.2024 19:52

      Немеряно просто людей пользуются дедупликацией. Просто не все про это знают.
      Например, все пользователи сервисов Google, AWS S3 или NUTANIX - эти сервисы все используют блочную дедупликацию. Как и ZFS. У меня, кстати, положительный опыт использования. На инкрементальных бэкапах - просто колоссальный выигрыш.
      Но, согласен, применять нужно с умом, ибо недешевое удовольствие.


  1. Crystal_Development
    12.06.2024 19:52

    Чел вот совет: Попроси ChatGPT сделать так чтобы он очеловечел текст. Попроси добавить " Ну, типо, короче" потом вырезай то что не нужно и получается статья которая была написана ИИ но не кто не догадается что это писал ИИ