optimize the checkIP and Long2IP impl

This commit is contained in:
Lion 2022-07-07 10:26:27 +08:00
parent 0e0664bf36
commit 7d66d96525
4 changed files with 51 additions and 22 deletions

View File

@ -9,20 +9,21 @@
package xdb package xdb
import ( import (
"encoding/binary"
"fmt" "fmt"
"os" "os"
"strconv" "strconv"
"strings" "strings"
) )
var shiftIndex = []int{24, 16, 8, 0}
func CheckIP(ip string) (uint32, error) { func CheckIP(ip string) (uint32, error) {
var ps = strings.Split(ip, ".") var ps = strings.Split(ip, ".")
if len(ps) != 4 { if len(ps) != 4 {
return 0, fmt.Errorf("invalid ip address `%s`", ip) return 0, fmt.Errorf("invalid ip address `%s`", ip)
} }
var buff = make([]byte, 4) var val = uint32(0)
for i, s := range ps { for i, s := range ps {
d, err := strconv.Atoi(s) d, err := strconv.Atoi(s)
if err != nil { if err != nil {
@ -33,20 +34,15 @@ func CheckIP(ip string) (uint32, error) {
return 0, fmt.Errorf("the %dth part `%s` should be an integer bettween 0 and 255", i, s) return 0, fmt.Errorf("the %dth part `%s` should be an integer bettween 0 and 255", i, s)
} }
buff[i] = byte(d) val |= uint32(d) << shiftIndex[i]
} }
// convert the ip to integer // convert the ip to integer
return binary.BigEndian.Uint32(buff), nil return val, nil
} }
func Long2IP(ip uint32) string { func Long2IP(ip uint32) string {
var buff = make([]string, 4) return fmt.Sprintf("%d.%d.%d.%d", (ip>>24)&0xFF, (ip>>16)&0xFF, (ip>>8)&0xFF, ip&0xFF)
buff[0] = fmt.Sprintf("%d", (ip>>24)&0xFF)
buff[1] = fmt.Sprintf("%d", (ip>>16)&0xFF)
buff[2] = fmt.Sprintf("%d", (ip>>8)&0xFF)
buff[3] = fmt.Sprintf("%d", (ip>>0)&0xFF)
return strings.Join(buff, ".")
} }
func MidIP(sip uint32, eip uint32) uint32 { func MidIP(sip uint32, eip uint32) uint32 {

View File

@ -9,11 +9,41 @@
package xdb package xdb
import ( import (
"encoding/binary"
"fmt" "fmt"
"net"
"testing" "testing"
"time" "time"
) )
func TestCheckIP(t *testing.T) {
var str = "29.34.191.255"
ip, err := CheckIP(str)
if err != nil {
t.Errorf("check ip `%s`: %s\n", str, err)
}
netIP := net.ParseIP(str).To4()
if netIP == nil {
t.Fatalf("parse ip `%s` failed", str)
}
u32 := binary.BigEndian.Uint32(netIP)
fmt.Printf("checkip: %d, parseip: %d, isEqual: %v\n", ip, u32, ip == u32)
}
func TestLong2IP(t *testing.T) {
var str = "29.34.191.255"
netIP := net.ParseIP(str).To4()
if netIP == nil {
t.Fatalf("parse ip `%s` failed", str)
}
u32 := binary.BigEndian.Uint32(netIP)
ipStr := Long2IP(u32)
fmt.Printf("originIP: %s, Long2IP: %s, isEqual: %v\n", str, ipStr, ipStr == str)
}
func TestLoadVectorIndex(t *testing.T) { func TestLoadVectorIndex(t *testing.T) {
vIndex, err := LoadVectorIndexFromFile("../../../data/ip2region.xdb") vIndex, err := LoadVectorIndexFromFile("../../../data/ip2region.xdb")
if err != nil { if err != nil {

View File

@ -12,6 +12,8 @@ import (
// Util function // Util function
var shiftIndex = []int{24, 16, 8, 0}
func CheckIP(ip string) (uint32, error) { func CheckIP(ip string) (uint32, error) {
var ps = strings.Split(ip, ".") var ps = strings.Split(ip, ".")
if len(ps) != 4 { if len(ps) != 4 {
@ -29,11 +31,9 @@ func CheckIP(ip string) (uint32, error) {
return 0, fmt.Errorf("the %dth part `%s` should be an integer bettween 0 and 255", i, s) return 0, fmt.Errorf("the %dth part `%s` should be an integer bettween 0 and 255", i, s)
} }
val |= uint32(d) << ((3 - i) * 8) val |= uint32(d) << shiftIndex[i]
} }
// convert the ip to integer
return val, nil return val, nil
} }

View File

@ -17,23 +17,26 @@ func TestCheckIP(t *testing.T) {
if err != nil { if err != nil {
t.Errorf("check ip `%s`: %s\n", str, err) t.Errorf("check ip `%s`: %s\n", str, err)
} }
netip := net.ParseIP(str).To4()
if netip == nil { netIP := net.ParseIP(str).To4()
if netIP == nil {
t.Fatalf("parse ip `%s` failed", str) t.Fatalf("parse ip `%s` failed", str)
} }
u32 := binary.BigEndian.Uint32(netip)
fmt.Printf("checkip: %d, parseip: %d, isequal: %v", ip, u32, ip == u32) u32 := binary.BigEndian.Uint32(netIP)
fmt.Printf("checkip: %d, parseip: %d, isEqual: %v\n", ip, u32, ip == u32)
} }
func TestLong2IP(t *testing.T) { func TestLong2IP(t *testing.T) {
var str = "29.34.191.255" var str = "29.34.191.255"
netip := net.ParseIP(str).To4() netIP := net.ParseIP(str).To4()
if netip == nil { if netIP == nil {
t.Fatalf("parse ip `%s` failed", str) t.Fatalf("parse ip `%s` failed", str)
} }
u32 := binary.BigEndian.Uint32(netip)
ipstr := Long2IP(u32) u32 := binary.BigEndian.Uint32(netIP)
fmt.Printf("originIP: %s, Long2IP: %s, isequal: %v", str, ipstr, ipstr == str) ipStr := Long2IP(u32)
fmt.Printf("originIP: %s, Long2IP: %s, isEqual: %v\n", str, ipStr, ipStr == str)
} }
func TestSplitSegment(t *testing.T) { func TestSplitSegment(t *testing.T) {