2012-12-14 2 views
1

Go 프로그램에서 작은 "라우팅 테이블"을 갖기 위해 약간의 코드를 만들고 싶습니다.트라이 테이블에서 IP 주소를 정렬하는 방법은 무엇입니까?

http://github.com/petar/GoLLRB 패키지가있는 왼쪽으로 기울어 진 빨강 - 검정 나무를 사용하고 있습니다. 기본적으로이 글꼴로 약간의 소란을 피우는 것 같지만, IP 주소를 올바르게 만들 때 IP 접두사를 올바르게 정렬하지 않는다고 생각됩니다. 나무. 내가 실험적으로 사용하는 "작음"기능은

func lessRoute(a, b interface{}) bool { 
    aNet := a.(Route).Net 
    bNet := b.(Route).Net 

    for i, a := range aNet.IP { 
     if a < bNet.IP[i] { 
      return true 
     } 
     if a > bNet.IP[i] { 
      return false 
     } 
    } 
    return false 
} 

이 아니라 매우 효율적으로, 나에게 정확한 결과를 제공하는 것 같습니다 (전체 코드가 https://gist.github.com/4283789에있다)입니다. 내 테스트 그때

AddRouteString(tree, "10.0.0.0/8", 10) 
AddRouteString(tree, "10.20.0.0/16", 20) 
AddRouteString(tree, "10.21.0.0/16", 21) 

에 대한 경로를 추가하고있어에서

이 권리를 발견하기 전에 10.21.0.0/16 및 10.20.0.0/16을 통해 볼 것이다 10.22.0.1에 경로를 찾는 결과.

올바른 결과를 더 빠르게 찾으려면 어떻게 트리를 주문해야합니까?

업데이트 : @jnml에는 IP 비교 속도를 높이는 방법에 대한 훌륭한 제안이 있습니다. (아마도 내가 할 수있는 최선의 방법 일 것입니다.) 접두어 길이를 사용하여 트리를 정렬하여 일치 항목을 적은 단계에서 찾을 수 있습니다. 그게 내가 찾고있는거야.

답변

1

아마 작성합니다

if bytes.Compare([]byte(a), []byte(b)) < 0 { 
     // ... whatever to do when address a < b (lexicographically) 
} 

또는 트리 비교기

:

func lessRoute(a, b interface{}) bool { 
     return bytes.Compare([]byte(a.(Route).Net.IP), []byte(b.(Route).Net.IP)) < 0 
} 

bytes.Compare()here를 기록.

+0

아, 맞습니다. 비교가 훨씬 빨라질 것입니다. 나의 관심사는 그러나 나무를 주문하는 방법이다; 접두사 길이를 이용하여 할 일이있는 것처럼 보입니다. –

+0

최신 프로세서는 전체 IP 주소를 L1 캐시로 가져오고 공통 접두어가 시작되는 위치를 계산할 수있는 것보다 빠르게 일반 접두사를 처리합니다. – TomOnTime

관련 문제