librown
@librown
На-все-руки-мастер и немного кодер

Насколько уникальная часть хеша (md5)?

Приветствую!
На проекте есть интерфейс диалогов "клиент - поставщик".
Для идентификации диалога использую первые 6 символов от md5-хеша строк (емейл_клиента + id_товара).

Пример: site.com/sms/367a46

Подскажите, нормальный ли это путь?
Какова вероятность совпадения этой части хеша для других комбинаций "id+емейл_клиента"?
Спасибо.

P.S. Почему только 6 символов? Нужна краткость - потому, что эти ссылки передаю с помощью смс-сообщений.
  • Вопрос задан
  • 8768 просмотров
Решения вопроса 1
wirtwelt
@wirtwelt
Ведущий программист, менеджер проектов
Дружище, никогда так не делай. Никогда!

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

Если тебе нужно номер заказа или еще какой-то UID, генерируй их как хочешь, хоть +1, хоть хэшем. Но изволь проверить на 100%, что такого уже нет в твоей базе/таблице, то бишь в том месте, где они должны быть уникальными.

Это единственный нормальный способ сделать задачу на 100%, а не с помощью баррикады из костылей. Мы же не ворожеи, чтобы надеяться и верить, мы инженеры и программисты.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Ну... как бы коллизии и для обычных md5 может быть.

Что до краткости - можно же перевести md5-хэш из 16-ти ричной системы, в систему с большим набором символов, тем самым сократив количество символов, этим можно уменьшить шансы попать в коллизию.

Вообще есть более короткие хэши, можно их использовать. Но коллизии всеравно могут быть.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Ну, общее количество вариантов в таком хэше 224. Значит с вероятностью 1/2 среди примерно 5000 наугад выбранных значений найдутся одинаковые. Парадокс дней рождения, однако.
Ответ написан
Комментировать
librown
@librown Автор вопроса
На-все-руки-мастер и немного кодер
Решил делать так:
hash ( 'crc32b' , md5( $client_email . $id ) );
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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