2008-10-13 4 views
4

При создании веб-приложения, которое каким-то образом отображает отображение уникального идентификатора для повторяющегося объекта (видеоролики на YouTube или раздел книги на моем сайте, например, мой), было бы лучше использовать единую длину идентификатор, например хэш, или уникальный ключ элемента в базе данных (1, 2, 3 и т. д.).Hashes vs Numeric id's

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

Вкратце: Что лучше использовать в качестве общедоступного уникального идентификатора - значения хэша или уникального ключа из базы данных?

Edit: Я открываю этот вопрос еще раз, потому что Дмитрий принес хорошую точку, не сковывая именование к БД конкретного свойства. Будет ли такая привязка мешать мне оптимизировать/нормализовать базу данных в будущем?

Платформа использует php/python с ISAM/w MySQL.

ответ

4

Если вы не пытаетесь скрыть состояние вашего внутреннего объекта ID счетчика, хэш понапрасну медленно (генерировать и сравнивать), бесполезно долго, бесполезно уродливым и бесполезно способным сталкиваться. GUID также длинны и уродливы, что делает их такими же непригодными для потребления человеком, как и хеши.

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

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

0

Хеши не гарантируются как уникальные, так и, я считаю, непротиворечивые.

+0

Они согласуются, но вы правы, говоря, что они не уникальны (по определению есть столкновения). Тем не менее, столкновения можно избежать в значительной степени, добавив какую-то случайную или неопределенную соль (микро- или случайное число) перед хешированием. – Karan 2008-10-13 04:50:37

+0

Добавление соли не будет иметь никакого отношения к числу столкновений. – 2008-10-13 04:52:09

+0

Хорошая точка. Сотрите это. – Karan 2008-10-13 04:56:59

2

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

0

Ваши пользователи должны помнить/использовать значение? или вы смотрите на него из POV безопасности?

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

0

Да, я не думаю, что вы ищете хэш - вы, скорее, ищете Guid.If вы на платформе .Net, попробуйте System.Guid.

Однако самая важная причина, по которой не использовать Guid, - это производительность. Включение и поиск базы данных в (длинных) строках очень субоптимально. Числа быстрые. Поэтому, если вам это действительно не нужно, не делайте этого.

2

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

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

Но будьте осторожны при столкновении, очевидно.

1

С хэш вы

  1. Свободен объединить базу данных с аналогичными один (или резервным копированием), при необходимости
  2. не делает что-то, что могло бы помочь некоторым Гадать атаки даже немного
  3. Не раскрывайте больше личной информации о пользователе, чем необходимо, например если кто-то видит пользователя номер 2 в вашем текущем входе в базу данных, они получают информацию о том, что он старик.
  4. (При условии, что вы используете длинный хэш или GUID), что очень помогает вам, если вы купили YouTube, и они решили интегрировать ваши базы данных.
  5. Помогите себе в случае появления поисковой системы, которая индексирует GUID.

Пожалуйста, дайте нам знать, если последние 6 месяцев принесли вам некоторую ясность по этому вопросу ...

0

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

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

Смежные вопросы