optimize the checkIP and Long2IP impl
This commit is contained in:
parent
0e0664bf36
commit
7d66d96525
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue