3

ピアツーピアアプリケーションを作成していますが、JavaハッシュセットにIP/ポートペアを格納するためのハッシュ関数が必要です。車輪の再発明ではなく、すでに解決策があるのではないかと思いましたが、グーグルはあまり成果を上げていません。

IPv4のハッシュ関数(IPv6でも機能する場合はボーナス!)とリモートポート番号を推奨できる人はいますか?

クライアントが同じホスト上にある場合を除いて、ポート番号は同じである可能性があります。同じホスト上にある場合は、順次になります。

4

2 に答える 2

5

String.hashCode()かなりリーズナブルです。私は単にこれを行います:

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

これはコーディング目的には十分に「ランダム」であるため、JDKAPIの多くに依存しています。

このマントラを覚えておいてください...「少ないコードは良い」

于 2012-03-13T23:15:53.077 に答える
1

ip^portあなたが得ることができるのと同じくらい簡単です

IP番号の最後の数ビットは本質的にランダムであるため、これはかなり適切です(ISPからのIPの割り当て)

これを拡張してip^port|port>>>16、すべての0または1で終了する問題を回避できます。

IPv6の場合は、次のことを行う必要があります(32ビット部分であるipv6_1^ipv6_2^ipv6_3^ipv6_4^port場合)ipv6_ii

あなたもすることができます

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よりも少し優れており、気分が良ければ順序を変更できます。

于 2012-03-13T23:17:00.543 に答える