Задать вопрос
@ivandao

Зачем делают ID в формате sha1?

У нас в базе в качестве ID записи вместо простого порядкового числа используется строка формата sha1.
Олды говорят, что это дает равномерное распределение данных по кластеру в процессе хранения и обработки.
Как это понимать и для чего это нужно? Влияет ли это на скорость доступа или еще на что-то?
  • Вопрос задан
  • 726 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 3
tsklab
@tsklab
Здесь отвечаю на вопросы.
Для получения суррогатного ключа фиксированной длины от естественного ключа переменной длины.
Ответ написан
@auoa16
Тут Вам по кусочкам дали ответ, осталось собрать воедино, чтобы было понятно что к чему. Далее по пунктам:

1) Первое и самое главное здесь то, для чего вообще это хеширование нужно. Правильный ответ Вам дали "олды", о которых Вы сами упомянули, + Сергей Горностаев привел пример отличной книги, где об этом можно почитать подробнее. Если в двух словах, то в распределенных базах данных(когда они хранятся в более чем одном экземпляре) прежде чем сохранить какую-то информацию в какой-то из экземпляров нужно для начала понять, а в какой именно экземпляр должны сохраняться определенные данные. Вот представьте, Вы регистрируетесь в инстаграм, там сотни экземпляров баз данных, как им определить в какой вас сохранить? И тут как раз вступает в дело та самая хеш-функция по каким-то уникальным данным(например по мэйлу или по номеру телефона), которая дает на выходе число. Именно это число определяет в какой экземпляр базы данных сохранить конкретного пользователя(чаще всего там используют деление по модулю на количество экземпляров, ну об этом подробнее можете прочитать в книге, о которой говорилось).

2) Теперь о том, почему это используют как id вместо обычных чисел. Причин может быть на самом деле много, я вам приведу сейчас самую наглядную, а подробнее уже сами потом изучите. Как говорилось выше, распределенная база данных это множество разных экземпляров баз данных, где в каждом экземпляре свои данные. Вот представьте, что у нас 10 разных экземпляров. И хеш-функция по вашему логину указала, что вас нужно сохранить в экземпляр №6. А по моему логину хеш-функция показала, что меня нужно сохранить в экземпляр №3. Тогда что получается: и я и вы теперь записаны в таблицу Users, только ваша таблица Users не имеет никакого отношения к моей, потому что эти таблицы находятся в разных базах данных. То есть логически это одна база данных, но по факту это разные экземпляры. И если бы мы с вами были первыми пользователями и в качестве id использовались бы обычные числа(например автоинкрементные поля), то в базу данных записалось бы два пользователя с одинаковым id(если мы первые пользователи то оба получили бы id=1 каждый в своей базе), что является катастрофой. Так вот чтобы избегать подобных ситуаций, используются специальные идентификаторы, которые называются uuid. Все популярные СУБД имеют встроенную поддержку таких идентификаторов и способы их генерации. Однако насколько я понял в вашем случае вместо использования встроенных функций для генерации uuid разработчики используют результат хеш-функции в качестве этого самого uuid, что довольно классное решение на мой взгляд. А что касается производительности - результат этой хеш-функции это такое число в шестнадцатиричном виде(только чуть больше, 20 байт против 16 у uuid), как классический uuid, поэтому производительность вряд ли пострадает.
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
Чтобы:
- без особой пользы в разы увеличить объём хранимых данных. Тем более если использовать строки.
- постараться запутать планировщик базы
- дополнительно увеличить стоимость записи индексов (значения случайны = значения пишутся в случайные места дерева, вы постоянно "пачкаете" разные страницы)

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

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

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