2012-03-13 5 views
3

피어 투 피어 애플리케이션을 작성 중이며 IP/포트 쌍을 Java 해시 세트에 저장하기위한 해시 함수가 필요합니다. 휠을 다시 발명하기보다는 이미 이미 해결책이 있는지 궁금해했지만 구글은별로 굴복하지 않았다.IP 주소 및 원격 포트에 대한 좋은 해시 함수

누구든지 IPv4 (IPv6에서도 작동하는 경우 보너스!) 및 원격 포트 번호에 해시 기능을 권장 할 수 있습니까?

클라이언트가 동일한 호스트에 있지 않으면 포트 번호가 같아 질 가능성이 있습니다 (이 경우 순차적입니다).

+2

바이너리 48 비트 값 (32 ip + 16 포트)으로 변환하는 것이 잘못된 이유는 무엇입니까? –

+0

어쩌면하지만 해시 함수는 32 비트 int를 반환해야합니다 –

+0

당신은 IP의 하위 16 비트와 포트를 XOR 할 수 있습니다. 단순한 해쉬 함수를 원하면 FNV를 확인하십시오. http://isthe.com/chongo/tech/comp/fnv/ –

답변

4

String.hashCode()은 매우 합리적입니다. 간단히 말해서 나는 이런 짓을 했을까 :

String ip; // if this is not a string, simply make it a string by + "" 
int port; 

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

그것은 "무작위"입니다 충분한 코딩 목적을 위해, 너무 많이는 JDK의 API의 대부분에 의해 의존되도록.

당신이이 IP 번호의 마지막 몇 비트가 본질적으로 무작위로 꽤 괜찮은

를 얻을 수 (약 간단이 진언 ... "적은 코드가 좋다"

+0

얼마나 효율적입니까? –

+0

매우 효율적입니다 : 거의 모든 자바 프로그램에서 매우 자주 호출되며 고도로 최적화되었습니다. 어쨌든, 당신이 JDK를 신뢰한다면, 저 레벨에서의 효율성에 대해 걱정할 필요가 없습니다. – Bohemian

1

ip^port 기억 당신이 ip^port|port>>>16와 그것을 확장 할 수 있습니다

는 ISP의 IP 할당은) 당신이 (ipv6_1^ipv6_2^ipv6_3^ipv6_4^port해야합니다 IPv6의 모든 0 또는 1

을 피할되고에서 끝나는 문제를 피하기 위해 ipv6_i되는 i 번째 32 비트 부분)

은 교환 법칙이 성립하지 않기 때문에 당신은 또한

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

또는

표준 XOR보다 약간 더 나은 표준 해시 함수로
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 

할 수 당신이 그것에 대해 더 잘 느끼면 주변 순서를 바꿀 수 있습니다