Уникален ли хэш GUID?

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

Кроме того, большинство ответов являются случайными и менее полезными, чем могли бы быть, потому что никто на самом деле не понимает вопрос и его основной смысл. Разъяснение сделало бы этот вопрос и ответы на него более полезными.

bzlm 26.09.2008 20:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
23
1
25 102
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

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

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

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

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

bzlm 26.09.2008 12:54

Криптографические хэши (например, MD5, SHA1) составляют 16-20 или более байтов. Хешируя GUID с таким хешем, он не уменьшит уникальность.

zvrba 26.09.2008 13:27

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

bzlm 26.09.2008 20:25

Хэш по определению «менее» уникален, чем оригинал. [Кстати, GUID статистически уникален]. 4-байтовый хэш весьма вероятно будет иметь коллизии.

Mitch Wheat 04.10.2008 17:03

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

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

Неа.

См. Здесь, если вам нужен мини-идентификатор GUID: https://devblogs.microsoft.com/oldnewthing/20080627-00/?p=21823

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

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

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

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

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

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

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

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

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