Я хочу сделать немного кода, чтобы иметь небольшую «таблицу маршрутизации» в моей программе Go.
Я использую левые красно-черные деревья с http://github.com/petar/GoLLRB package, и в основном он работает после того, как немного повозился с ним, однако я подозреваю, что неправильно сортирую префиксы 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-адресов (и, возможно, это лучшее, что я могу сделать), но мне кажется, что есть способ извлечь выгоду из длина префикса, чтобы упорядочить дерево, чтобы совпадения можно было найти за меньшее количество шагов. Это то, что я ищу.