Зачем использовать хеширование для создания путей к большим коллекциям файлов?

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

Обновлено: примерами часто являются цифровые библиотеки или репозитории, хотя самый простой пример, который я могу придумать (который можно установить примерно за 30 секунд), - это База данных документов / цитирований Zotero.

Зачем это делать?

Обновлено: спасибо Мэт за ответ - есть ли у этой техники использования хеша для создания пути к файлу имя? Это шаблон? Я хотел бы прочитать больше, но не нашел ничего в Цифровая библиотека ACM

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
2 033
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

tvanfosson 04.12.2008 01:20

Никаких проверок существования никогда не производится. Обычно вы помещаете что-то и сохраняете его местоположение в своей базе данных.

Stephen 04.12.2008 01:21
Ответ принят как подходящий

Хеш / B: дерево

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

Если вы собираетесь использовать такие вещи, как «<» или «>» или что-то еще, кроме «=», вы захотите использовать B: Tree, потому что оно сможет выполнять такой поиск.

Структура каталогов

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

Вы можете быть уверены, что для метода хеширования foo, foo («что-то») всегда будет возвращать одно и то же, скажем, «grbezi». Теперь вы используете часть этого хэша для хранения файла, скажем, в gr / be / something. В следующий раз, когда вам понадобится этот файл, вам просто нужно будет вычислить хэш, и он будет доступен напрямую. Кроме того, вы получаете тот факт, что с хорошей хеш-функцией распределение хешей в хеш-пространстве довольно хорошее, и для большого количества файлов они будут равномерно распределены внутри иерархии, таким образом разделяя нагрузку.

Мне больше понравился твой оригинальный ответ. Почему вы его изменили?

Stephen 04.12.2008 01:29

Хм, да, мне это не понравилось, смешаю их двоих :-)

mat 04.12.2008 01:54

спасибо, у этого метода использования хеша для определения местоположения в файловой системе есть имя? (это шаблон?)

Stephen 04.12.2008 02:29

Понятия не имею, есть ли у него название :-)

mat 04.12.2008 03:53

Хеши также придают уникальность имени пути. Очень мало конфликтов имен.

Думая, что это было бы очень плохой идеей, если гипотетическая функция хеширования, скажем, та, которая возвращает по модулю 264, что даст вам 64-битное число, у вас не будет конфликтов для чисел от 0 до 2 ^ 64-1, тогда, когда вы дойдете до 264, она будет конфликтовать с 0 и так далее.

mat 04.12.2008 02:07

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

joveha 04.12.2008 18:25

Я думаю, нам нужно немного внимательнее взглянуть на то, что вы пытаетесь сделать. В общем, хэш и B-дерево абстрактно обеспечивают две общие операции: «вставить элемент» и «поиск элемента». Хэш выполняет их, асимптотически, за время О (1), пока хеш-функция хорошо ведет себя (хотя в большинстве случаев хеш-код с очень плохим поведением для конкретной рабочей нагрузки может быть таким же плохим, как На)). Для сравнения, дерево AB требует O (журнал n) время и на прошивки, и на поиски. Итак, если это единственные операции, которые вы выполняете, хеш-таблица - более быстрый выбор (и значительно проще, чем реализация B-дерева, если вы должны написать его самостоятельно).

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

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

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

Другие вопросы по теме