Давайте начнем с этого:
Согласно спецификации UUID, сама UUID очень хорошо в уникальности генерируемый UUID-х и вероятность столкновения очень очень очень мало.
На самом деле, это не говорит об этом. Он не может этого сказать, потому что это не имеет смысла.
На самом деле, если спецификация UUID говорит о уникальности UUID типа 4, это говорит о том, что они являются только такими же хорошими, как источник случайных чисел. И это зависит от платформы и качества реализации RNG & UUID. Если мы можем предположить идеальный источник случайных чисел, то вероятность того, что любые два (отдельно сгенерированные) UUID будут одинаковыми, включается в 2 ; то есть очень, очень мало. С другой стороны, если у вас плохой источник случайных чисел, вероятность парного столкновения возрастает.
Таким образом, это не означает, что этот фрагмент кода действительно снижает качество уникальности, хешируя его с помощью MD5, который теперь является устаревшим механизмом хэширования и подвержен столкновениям и атакам.
Да. Но MD5 - не настоящая проблема.
Как говорит @Doug Stevenson, хеширование UUID не уменьшает вероятность столкновения. Даже для алгоритма хеширования, который не имеет известной слабости. Каким бы ни был алгоритм, существует вероятность того, что хеширующие UUID увеличит вероятность столкновений .
Так что, в общем, нет смысла в хэшировании одного UUID.
Однако, если вам нужен токен с меньшей вероятностью столкновения, чем UUID типа 4, вы можете объединить UUID N типа 4 в один байт-массив и затем создать хэш для массива. Если у вас есть (сильный) алгоритм хеширования M-бит и идеальный источник случайных чисел для вашего генератора UUID, вероятность столкновения должна быть примерно одна в 2 мин (M, 122 * N).
1 - То есть, источник случайных битов, где это невозможно для кого-то (злоумышленник), чтобы предсказать следующий бит в последовательности с чем-нибудь другим, чем 50% вероятность того, чтобы быть правильным.
2 - Это произойдет, если есть два разных UUID, имеющих одинаковый хеш. Это возможно даже для сильного алгоритма хэширования ... если вы не определили, что это критерий, по которому вы измеряете силу.
Передача случайного ввода через хеш-функцию эквивалентна простому случайному входу один раз. –
Кстати, это имя переменной 'guid' является неправильным. A [GUID - глобально уникальный идентификатор] (https://en.wikipedia.org/wiki/Globally_unique_identifier) обычно относится к типу UUID, обычно используемому в мире Microsoft. GUID, безусловно, * не * хеш MD5 UUID. Это имя переменной кажется мне красным, что автор этого кода не имел полного понимания. –
@BasilBourque Я согласен с тобой :) –