2012-12-14 30 views
1

我想製作一些代碼來在我的Go程序中有一個小的「路由表」。如何排序特里表中的IP地址?

我使用的左傾紅黑樹與http://github.com/petar/GoLLRB包,基本上它看起來工作後有點忙,但我懷疑我沒有正確排序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.22.0.1的路線會顯得通過10.21.0.0/16和10.20.0.0/16尋找合適的時候才結果。

我該如何命令我的樹更快地找到正確的結果?

更新:@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