@MrOnatsky

Сойдет ли такое распределение файлов по его id?

Добрый день. Это больше не вопрос, а так, посоветоваться.
Какое-то время мудрил над распределение файлов по его id, и остановился на таком вот варианте:
1. Конвертируем id из десятичного в шестнадцатеричный. Идентификатор должен быть больше или равен 4096, чтобы в итоге шестнадцатеричное число было в длину больше или равным 4.
2. Хранилище состоит из уровней. На каждом уровне по 256 папок. В итоге 256^2 = 65536 папок. Если брать за максимальное оптимальное кол-ва файлов в папке тысячу, то в итоге хранилище у нас на 65536000 файлов (по 1000 в каждой папке). Для названия папки первого уровня, "отрезаем" 2 последних цифры id, для второго уровня еще 2 последних цифры. Таким образом мы добьемся равномерного распределения. Вот пример определения пути:
$dir = substr($hex, -2, 2) . '/' . substr($hex, -4, 2);

3. Для имени файла используем его id и если нужно обезопасить от перебора для скачивания, то добавляем к нему произвольную строку (к примеру hash-сумму, алгоритма crc32 будет достаточно) и по просто по id файл не достать.
Пример: /e5/f5/83f5e5-r45c943k.jpg
Сделав тесты, при 10 млн файлов, в каждой папке было 152-153 файла.
Как вам вариант? Есть ли камни? Криво? Заранее спасибо!
  • Вопрос задан
  • 104 просмотра
Пригласить эксперта
Ответы на вопрос 2
@RidgeA
Я бы этап
Конвертируем id из десятичного в шестнадцатеричный

заменил на MD5 хэш от id или какого-то другого значения.

Это бы решило
Идентификатор должен быть больше или равен 4096

и
Для имени файла используем его id и если нужно обезопасить от перебора для скачивания, то добавляем к нему произвольную строку (к примеру hash-сумму, алгоритма crc32 будет достаточно) и по просто по id файл не достать


А так, как по мне, вроде нормальною
Ответ написан
Комментировать
index0h
@index0h
PHP, Golang. https://github.com/index0h
Норм, правда для генерации id я бы взял обычный uuid v4. Посмотрите также в сторону решений, типа mogilefs, возможно ваш велосипед вам и не нужен
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы