ピアツーピアアプリケーションを作成していますが、JavaハッシュセットにIP/ポートペアを格納するためのハッシュ関数が必要です。車輪の再発明ではなく、すでに解決策があるのではないかと思いましたが、グーグルはあまり成果を上げていません。
IPv4のハッシュ関数(IPv6でも機能する場合はボーナス!)とリモートポート番号を推奨できる人はいますか?
クライアントが同じホスト上にある場合を除いて、ポート番号は同じである可能性があります。同じホスト上にある場合は、順次になります。
ピアツーピアアプリケーションを作成していますが、JavaハッシュセットにIP/ポートペアを格納するためのハッシュ関数が必要です。車輪の再発明ではなく、すでに解決策があるのではないかと思いましたが、グーグルはあまり成果を上げていません。
IPv4のハッシュ関数(IPv6でも機能する場合はボーナス!)とリモートポート番号を推奨できる人はいますか?
クライアントが同じホスト上にある場合を除いて、ポート番号は同じである可能性があります。同じホスト上にある場合は、順次になります。
String.hashCode()
かなりリーズナブルです。私は単にこれを行います:
int hash = (ip + "/" + port).hashCode();
これはコーディング目的には十分に「ランダム」であるため、JDKAPIの多くに依存しています。
このマントラを覚えておいてください...「少ないコードは良い」
ip^port
あなたが得ることができるのと同じくらい簡単です
IP番号の最後の数ビットは本質的にランダムであるため、これはかなり適切です(ISPからのIPの割り当て)
これを拡張してip^port|port>>>16
、すべての0または1で終了する問題を回避できます。
IPv6の場合は、次のことを行う必要があります(32ビット部分であるipv6_1^ipv6_2^ipv6_3^ipv6_4^port
場合)ipv6_i
i
あなたもすることができます
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よりも少し優れており、気分が良ければ順序を変更できます。