Вопрос

Я создаю GUID (в виде строки) и получаю его хэш.Могу ли я считать этот хэш уникальным?

Это было полезно?

Решение

Не так уж и уникально, как сам GUID, нет.

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

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

Другие советы

Неа.

См. здесь, если вам нужен мини-GUID: http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx

Одним словом, нет.

Предположим, что ваш хэш имеет меньше битов, чем GUID. По принципу «ячейки» должно существовать более одного сопоставления некоторого GUID -> хэш просто потому, что хэшей меньше, чем GUIDS.

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

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

Хорошие алгоритмы хеширования сводят к минимуму вероятность этого, и, как правило, чем больше битов в хеше, тем меньше вероятность коллизии.

Его не гарантировано чтобы быть в связи с хеш-коллизии.Сам GUID почти гарантированно будет.

По практическим соображениям вы, вероятно, можете предположить, что хэш уникален, но почему бы не использовать сам GUID?

Нет, и я бы не стал предполагать уникальность какого-либо значения хеш-функции.Это не должно иметь значения, поскольку хеш-значения не обязательно должны быть уникальными, они просто должны быть равномерно распределены по всему диапазону.Чем равномернее распределение, тем меньше происходит коллизий (в хеш-таблице).Меньшее количество коллизий означает лучшую производительность хэш-таблицы.

К вашему сведению, для хорошего описания того, как работают хэш-таблицы, прочитайте принятый ответ на Что такое хеш-таблицы и хэш-карты и их типичные варианты использования?

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

Я хотел бы хэшировать размер GUID до размера X, понимая, что иногда у меня есть 10 или меньше GUIDS в наборе, поэтому я мог бы обойтись более коротким хешем без коллизий, чем если бы у меня было 10 000 000 GUID в наборе.Я просто хотел бы иметь возможность указать размер хеша при вызове функции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top