Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > хэширования без коллизий


Автор: zasaz63 31.5.2013, 01:49
Всем доброго времени суток!
Кто-нибудь знает метод хэширования без коллизий? Будет использоваться чисто в декоративных целях(на основе id), поэтому устойчивость к взлому необязательна.

Автор: bars80080 31.5.2013, 14:13
md5
у него есть коллизии?

Автор: Arantir 31.5.2013, 14:21
Цитата(zasaz63 @  31.5.2013,  00:49 Найти цитируемый пост)
Будет использоваться чисто в декоративных целях(на основе id), поэтому устойчивость к взлому необязательна. 

Почему бы тогда просто не генерировать строки в криптографическом порядке?

Автор: Fortop 31.5.2013, 23:55
Цитата(zasaz63 @  31.5.2013,  01:49 Найти цитируемый пост)
Кто-нибудь знает метод хэширования без коллизий?

Нет, не знает и никогда не узнает

Цитата(bars80080 @  31.5.2013,  14:13 Найти цитируемый пост)
у него есть коллизии? 

есть
А что?

Автор: Arantir 1.6.2013, 00:13
Цитата(zasaz63 @  31.5.2013,  00:49 Найти цитируемый пост)
в декоративных целях

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

Автор: zasaz63 1.6.2013, 00:38
Цитата(Arantir @ 1.6.2013,  00:13)
Вообще, есть много способов получать уникальные строчки с буковок, помимо подсчета хэша...

Подскажите какие

Автор: Arantir 1.6.2013, 01:30
Цитата(zasaz63 @  31.5.2013,  23:38 Найти цитируемый пост)
Подскажите какие 


Ну, например:
1, 2, 3, 4,... и так до бесконечности, и никогда не повторяются.
А запись числа — понятие относительное. Вспомните 16-ричную систему счисления. Строка "F4D4C654DE5" обозначает десятичное число 16824668605925. Достаточно каждый раз прибавлять +1 (или +2, или +10, или +100, но всегда одинаково) и строки никогда не повторятся. Нужно только проводить сложение не в десятичной, а 16-ричной системе.
При этом можно пользоваться k-ичной системой счисления со сколь угодно большим k, на которое хватит символов. Например, 36-ричной, если взять все цифры и английские буквы.

Второй пример:
Порождение комбинаторных объектов. На эту тему есть много материала, так как это раздел алгоритмизации, его преподают в университетах и т.п. Например, http://www.codenet.ru/progr/other/prbook/gl2.php
Можно, например, генерировать все возможные перестановки в какой-то строке, где нет одинаковых символов. Например, в "qwertyuiopasdfghjkl". При этом, чтобы создать следующее значение, достаточно знать только предыдущее.
Если в строке нет одинаковых символов, то все перестановки уникальны. Для строки в 19 символов их 121645100408832000 штук (надолго хватит...). Ну если начинать сразу с "qwertyuiopasdfghjkl", то остается чуть поменьше. (Первая строка — с символами в алфавитном порядке).
Поскольку мы получаем их последовательно, то никогда не получим уже полученного ранее значения.

Автор: zasaz63 1.6.2013, 06:04
как всё страшно) Спасибо!

Автор: bars80080 1.6.2013, 11:03
Цитата(Fortop @  31.5.2013,  23:55 Найти цитируемый пост)
есть
А что? 

и какие?

чисто интересно. а то пользуюсь и не догадываюсь, может мне нервничать надо?

Автор: cutwater 2.6.2013, 00:05
Цитата(bars80080 @  1.6.2013,  10:03 Найти цитируемый пост)
чисто интересно. а то пользуюсь и не догадываюсь, может мне нервничать надо? 


Возьмем множество входов N = {0, ... n} и множество выходов N` = {H(0), ..., H(n)}, где H - хеш-функция. Допустим что хеш-функция на множестве входов N представляет собой однозначную подстановку из N в N`, т.е. любому входу из множества N будет однозначно соответствовать выход из множества N`. Теперь возьмем значение хеш-функции от n+1. Так как множество выходов хеш-функции ограничено множеством N`, на входе n+1 хеш-функция даст выход из множества N`.

Таким образом абсолютно любая хеш-функция на множестве входов > множества выходов будет иметь коллизии, т.е. два значения n и m, для которых H(n) == H(m)

Автор: krundetz 3.6.2013, 09:45
Цитата(bars80080 @  31.5.2013,  14:13 Найти цитируемый пост)
md5
у него есть коллизии? 

Пример коллизии
Код


                      Сообщение 1
    4d c9 68 ff 0e e3 5c 20 95 72 d4 77 7b 72 15 87
    d3 6f a7 b2 1b dc 56 b7 4a 3d c0 78 3e 7b 95 18
    af bf a2[00]a8 28 4b f3 6e 8e 4b 55 b3 5f 42 75
    93 d8 49 67 6d a0 d1[55]5d 83 60 fb 5f 07 fe a2
                      
                      Сообщение 2     
    4d c9 68 ff 0e e3 5c 20 95 72 d4 77 7b 72 15 87
    d3 6f a7 b2 1b dc 56 b7 4a 3d c0 78 3e 7b 95 18
    af bf a2[02]a8 28 4b f3 6e 8e 4b 55 b3 5f 42 75
    93 d8 49 67 6d a0 d1[d5]5d 83 60 fb 5f 07 fe a2
                       
                     Общий хеш MD5
    
            008ee33a9d58b51cfeb425b0959121c9


Вообще насколько я понимаю, безколлизионных хэш функций быть не может.

Автор: bars80080 3.6.2013, 12:32
пффф, ну ясен пень. если бы не было коллизий, то это было бы шифрование. при желании, даже обратимое

а как иначе оно может быть, если у нас на выходе 

Цитата(cutwater @  2.6.2013,  00:05 Найти цитируемый пост)
хеш-функции ограничено множеством


Автор: baldina 3.6.2013, 13:36
Цитата(zasaz63 @  31.5.2013,  01:49 Найти цитируемый пост)
Кто-нибудь знает метод хэширования без коллизий

Цитата(krundetz @  3.6.2013,  09:45 Найти цитируемый пост)
безколлизионных хэш функций быть не может

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

Цитата(Arantir @  31.5.2013,  14:21 Найти цитируемый пост)
Почему бы тогда просто не генерировать строки в криптографическом порядке?

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)