Обработка близко-к-невозможному коллизий на значениях should-be-unique

Вы не должны знать что уровень детализации в контроллере. Ваши маршруты и формы заставят соответствующие объекты быть добавленными к хешу параметрических усилителей. Тогда в контроллере Вы просто получаете доступ, говорят params[:foo], чтобы получить параметр нечто и сделать независимо от того, что Вы должны с ним.

отображение между ДОБИРАЕТСЯ и POST (и ПОМЕСТИТЕ и УДАЛИТЕ), и действия контроллера настраиваются в config/routes.rb в самом современном коде направляющих.

7
задан Community 23 May 2017 в 12:16
поделиться

2 ответа

  • Если вы справитесь с ними, как вы оправдаете эту работу (для себя и других), учитывая, что есть более вероятные случаи, которые вы не обрабатываете, например, сверхновая?

Ответ это значит, что вы не тестируете, чтобы обнаружить случайное столкновение GUID. Вы тестируете, чтобы обнаружить коллизию GUID, возникающую из-за ошибки в коде GUID, или предварительное условие, на которое полагается код GUID, который вы нарушили (или был обманут в нарушении каким-то злоумышленником), например, в V1 этот MAC адреса уникальны, и время идет вперед. И то, и другое значительно более вероятно, чем ошибки, связанные с сверхновыми.

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

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

Если ваше приложение генерирует «GUID» без хеширования на машинах, которые вы не контролируете, например, на клиентах, то забудьте о случайных столкновениях, вы беспокоитесь о преднамеренных столкновениях со стороны злонамеренных клиентов, пытающихся DOS вашего сервера. Защита себя от этого, вероятно, в любом случае защитит вас от несчастных случаев.

  • Или даже эти дела следует рассматривать изящно?

Ответ на это, вероятно, «нет». Если вы могли изящно обрабатывать конфликтующие идентификаторы GUID, как это делает хеш-таблица, тогда зачем вообще беспокоиться о GUID? Весь смысл «идентификатора» в том, что если две вещи имеют одинаковый идентификатор, то они одинаковы. Если вы не хотите относиться к ним одинаково, просто сначала направьте их в сегменты, как это делает хеш-таблица, а затем используйте другую схему (например, хеш-код).

тогда зачем вообще возиться с GUID? Весь смысл «идентификатора» в том, что если две вещи имеют одинаковый идентификатор, то они одинаковы. Если вы не хотите относиться к ним одинаково, просто сначала направьте их в сегменты, как это делает хеш-таблица, а затем используйте другую схему (например, хеш).

тогда зачем вообще возиться с GUID? Весь смысл «идентификатора» в том, что если две вещи имеют одинаковый идентификатор, то они одинаковы. Если вы не хотите относиться к ним одинаково, просто сначала направьте их в сегменты, как это делает хеш-таблица, а затем используйте другую схему (например, хеш).

7
ответ дан 6 December 2019 в 23:12
поделиться

При хорошем 128-битном хеш-коде вероятность столкновения с конкретным значением хеш-функции при случайном вводе равна:

1/2 ** 128 , что примерно равно 3 * 10 ** -39 .

Вероятность отсутствия столкновений ( p ) для n выборок может быть вычислена с использованием логики, используемой для объяснения проблемы дня рождения .

p = (2 ** 128)! / (2 ** (128 * n) * (2 ** 128 - n)!)

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

Вероятность случайного конфликта SHA-1 по мере увеличения количества выборок. http://img21.imageshack.us/img21/9186/sha1collision.png

Между 10 ** 17 и 10 ** 18 хешей мы начинаем видеть нетривиальные вероятность столкновения от 0,001% до 0. 14% и, наконец, 13% с хешами 10 ** 19 . Таким образом, в системе с миллионом, миллиардом записей рассчитывать на уникальность, вероятно, неразумно (и такие системы мыслимы), но в подавляющем большинстве систем вероятность коллизии настолько мала, что вы можете полагаться на уникальность своих хэшей. для всех практических целей.

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

4
ответ дан 6 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

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