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比較快(也許這是我能做的最好的)一個很好的建議,但它似乎對我來說,有會是一個方法,使優勢的前綴長度來訂購樹,所以匹配可以在更少的步驟中找到。這就是我正在尋找的。
啊,是的 - 這會讓比較快得多。我關心的是如何訂購樹;似乎還有些事情需要利用前綴長度來實現。 –
現代處理器會將整個IP地址拉入L1緩存並處理公用前綴的速度比計算公共前綴的起始位置更快。 – TomOnTime