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 비교 속도를 높이는 방법에 대한 훌륭한 제안이 있습니다. (아마도 내가 할 수있는 최선의 방법 일 것입니다.) 접두어 길이를 사용하여 트리를 정렬하여 일치 항목을 적은 단계에서 찾을 수 있습니다. 그게 내가 찾고있는거야.
아, 맞습니다. 비교가 훨씬 빨라질 것입니다. 나의 관심사는 그러나 나무를 주문하는 방법이다; 접두사 길이를 이용하여 할 일이있는 것처럼 보입니다. –
최신 프로세서는 전체 IP 주소를 L1 캐시로 가져오고 공통 접두어가 시작되는 위치를 계산할 수있는 것보다 빠르게 일반 접두사를 처리합니다. – TomOnTime