Построить ключ

bav46

Задача
есть 4 значения: string a1 int b1 string a2 int b2
нужно предложить решение ключа
чтобы a1, b1, a2, b2 имело одинаковый ключ с a2, b2, a1, b1
то есть меняя пары.
есть идеи как это сделать быстро? ключ получить в каком-нибудь int или string чтобы потом занести в хештейбл и при этом было минимальное число колизий.

slonishka

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

bav46

да кстати
можно просто рассматривать string a1 и string a2
вообщем нужен ключ нечуствительный к перестановке

slonishka

ну я решил твою задачу )

katrin2201

еще можно ксорить символы в строчках и хешировать результат

kokoc88

можно просто рассматривать string a1 и string a2
Можно умножить хэши строк.
Edit: конечно, это гон...
Edit: ну ладно, не гон... :smirk:
Edit: ладно, всё-таки гон... :mad:

Papazyan

Атсартируй сначала по возрастанию.

Maurog

суммируй байты % модуль
можешь поксорить (по-байтно, по DWORD-но)
и тд
либо так:
придумай любой хеш для пары (string, int) -> hash
тогда для пар пар хеш такой:
result = f(hash(a1, b1 hash(a2, b2
где f - симметричная функция

bav46

все спасибо чето башка совсем не варит :D

kokoc88

Можно умножить хэши строк.
Ой, кажется, я нагнал, а мне плюсы ставят... :crazy:

tokuchu

Можно умножить хэши строк.
Edit: конечно, это гон...
Почему гон? Умножение коммутативно. Можно, кстати их ещё поксорить (не строки, а хеши). :)

slonishka

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

bav46

ты все правильно сказал. это же и есть симметричная функция

slonishka

Почему гон? Умножение коммутативно. Можно, кстати их ещё поксорить (не строки, а хеши).
и деструктивно (для коллизеев всяких)

slonishka

причем конкретно умножение вообще дико деструктивно на практике.
типа если у тебя одно из полей не заполнено, у всех таких пар будет один хеш.

tokuchu

и деструктивно (для коллизеев всяких)
А, ну коллизии возможны, конечно.

tokuchu

Кстати, упорядочивать можно не строки, а хеши. :)

slonishka

два хеша считать и выбирать меньший?

slonishka

а, считать от каждого из двух и писать по порядку?
мне нравится.

katrin2201

Можно умножить хэши строк.
Edit: конечно, это гон...
Edit: ну ладно, не гон...
гон, гон =) приду домой - запощу java puzzler на эту тему =)

kokoc88

Почему гон? Умножение коммутативно. Можно, кстати их ещё поксорить (не строки, а хеши). :)
Я сказал, что это гон, потому что распределение будет неравномерное. Умножение даст наклонную вниз: |\
Надо бы сложить два хэша в long и взять mod по max int. Или сделать XOR обоим хэшам.

katrin2201

Мм. Не подумал, беру свои слова обратно. Косяк, конечно, есть, но ключу не мешает =)
Оставить комментарий
Имя или ник:
Комментарий: