Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: уникальный хеш из двух чисел
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Задача на миллион! Есть 2 любые числа, нужно получить такое число (хеш) что бы оно было уникальным для любой пары, но не зависело от расположения этих чисел. Например
есть 2 числа 1 и 2, нужна формула по который для 1 и 2 будет такой же хеш как и для 2 и 1, но уникальный для другой пары.
То есть
1 * 2 = 2
2 * 1 = 2
но в этой формуле слишком много колизий, например 2*10 = 20 5*4 тоже = 20, а нужны уникальные значения для каждой пары.
Простой код для проверки коллизий
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
dcc0
Отправлено: 25 Октября, 2014 - 21:50:11
Участник
Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014
Помог: 10 раз(а)
А нельзя так? Генерировать хе ш для 1 затем для 2
Собирать в одно число, обрезать каждый хеш, соединять в один из двух кусков, при этом ввести правило, что в самом алгоритме, допустим, меньшее всегда предшествует большему. Т.е. числа упорядочиваютя до операции хешерования.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
OrmaJever
Отправлено: 26 Октября, 2014 - 10:31:25
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
ладно, раз в предложениями туго тогда опишу идея по другому.
Есть таблица сообщений в бд с полями from_id (от кого) и to_id (кому)
Дак вот, все эти сообщения нужно групировать и выводить в виде беседы, то есть
from_id = 5 AND to_id = 10
это одна беседа с
from_id = 10 AND to_id = 5
То есть мне для вывода списка бесед нужно сгрупировать по этим двум полям, но как если они могут быть в разной последовательности?
Вариант создать другую таблицу "conversation" где будет id беседы - не предлагать
Я могу создать отдельное поле в котором хранить id или хеш беседы, но как его генерировать?
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Мелкий
Отправлено: 26 Октября, 2014 - 11:08:35
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Я-то думал задача сугубо математическая.
Берёте поле в 2 раза превышающее по размеру from_id и to_id, bigint, видимо, и пишете туда (для 64-битной версии PHP, для 32-битной лучше со строками и str_pad сделать):
но сейчас вот подумал, я ведь могу в php сортировать from_id и to_id от меньшего до большего и делать из них хеш который буду записывать в отдельное поле. Это же банально просто
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Мелкий
Отправлено: 26 Октября, 2014 - 11:31:26
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Можно и на sql, if есть, возведение в степень тоже.
Операторами бинарного сдвига будет компактнее, да только я их не помню
----- PostgreSQL DBA
OrmaJever
Отправлено: 26 Октября, 2014 - 13:03:38
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
так, окей, это работает! Но теперь главный вопрос, насколько эти вычисления в group by ресурсоёмкие? Может всё такие лучше создать отдельное поле и результат вот этих вычислений (на php) записывать туда и группировать по уже готовому результату?
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
snikers987
Отправлено: 26 Октября, 2014 - 13:26:27
Участник
Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011 Откуда: Крым
Помог: 25 раз(а)
Может я чего то не понял, а что мешает взять 2 числа и конкатенировать их, предварительно отсортировав, например по формуле, $min_id.$max_id ?
----- Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
OrmaJever
Отправлено: 26 Октября, 2014 - 14:05:29
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
snikers987 пишет:
а что мешает взять 2 числа и конкатенировать их
по сути ничего, только нужно добавить сепаратор потому что 311 и 415 совпадёт с 31 и 1415, и тут уже вопрос в производительности, мне кажется что математически операции быстрее чем обьединение строк (Добавление)
В общем решено, отдельное поле с индефикатором переписки в любом случае нужно создавать, что бы потом его в ссылку писать для отображения самой переписки. В каком формате делать уже по ходу решу.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.