Хорошая хеш-функция для IP-адресов и удаленных портов - PullRequest
3 голосов
/ 14 марта 2012

Я пишу одноранговое приложение, и мне нужна хеш-функция для хранения пар IP / порт в хэш-наборе Java.Вместо того, чтобы заново изобретать колесо, я задавался вопросом, есть ли уже решения, но Google мало что дал.

Может кто-нибудь порекомендовать хэш-функцию для IPv4 (бонус, если она работает и для IPv6!) Иномер удаленного порта?

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

Ответы [ 2 ]

5 голосов
/ 14 марта 2012

String.hashCode() довольно разумно.Я бы просто сделал это:

int hash = (ip + "/" + port).hashCode();

Это «случайно» достаточно для целей кодирования, настолько, что на него опирается большая часть API JDK.

Запомните эту мантру... "меньше кода - это хорошо"

1 голос
/ 14 марта 2012

ip^port примерно так же просто, как вы можете

это довольно прилично, так как последние несколько бит в номере IP по сути случайны (назначение ip от провайдера)

Вы можете расширить это с помощью ip^port|port>>>16, чтобы избежать проблемы с завершением на всех 0 или 1, избегая

для IPv6 вам нужно ipv6_1^ipv6_2^ipv6_3^ipv6_4^portipv6_i, являющимся i th 32-битной частью)

Вы также можете сделать

int hash=17;
hash=hash*5+ip;
hash=hash*5+port;
return hash

или

int hash=17;
hash=hash*5+ipv6_1;
hash=hash*5+ipv6_2;
hash=hash*5+ipv6_3;
hash=hash*5+ipv6_4;
hash=hash*5+port;
return hash

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

...