Go/GoLang check IP address in range

前端 未结 5 1996
萌比男神i
萌比男神i 2020-12-29 06:12

In Go/GoLang, what is the fastest way to check if an IP address is in a specific range?

For example, given range 216.14.49.184 to 216.14.49.191

5条回答
  •  独厮守ぢ
    2020-12-29 07:01

    I ported over the code from a C# example found here: https://stackoverflow.com/a/2138724/1655418

    And for some reason it ends up being 1ms faster than Nick's solution.

    My question was for the "fastest" way, so I figured I'd post mine and see what the community thinks.

    package iptesting
    
    import (
        "fmt"
        "testing"
        "net"
        "time"
        "bytes"
    )
    
    func TestIPRangeTime(t *testing.T) {
        lowerBytes := net.ParseIP("216.14.49.184").To4()
        upperBytes := net.ParseIP("216.14.49.191").To4()
        inputBytes := net.ParseIP("216.14.49.184").To4()
    
        startTime := time.Now()
        for i := 0; i < 27000; i++ {
            IsInRange(inputBytes, lowerBytes, upperBytes)
        }
        endTime := time.Now()
    
        fmt.Println("ELAPSED time port: ", endTime.Sub(startTime))
    
        lower := net.ParseIP("216.14.49.184")
        upper := net.ParseIP("216.14.49.191")
        trial := net.ParseIP("216.14.49.184")
    
        startTime = time.Now()
        for i := 0; i < 27000; i++ {
            IsInRange2(trial, lower, upper)
        }
        endTime = time.Now()
    
        fmt.Println("ELAPSED time bytescompare: ", endTime.Sub(startTime))
    }
    
    func IsInRange2(trial net.IP, lower net.IP, upper net.IP) bool {
        if bytes.Compare(trial, lower) >= 0 && bytes.Compare(trial, upper) <= 0 {
            return true
        }
        return false
    }
    
    func IsInRange(ip []byte, lower []byte, upper []byte) bool {
        //fmt.Printf("given ip len: %d\n", len(ip))
        lowerBoundary := true
        upperBoundary := true
        for i := 0; i < len(lower) && (lowerBoundary || upperBoundary); i++ {
            if lowerBoundary && ip[i] < lower[i] || upperBoundary && ip[i] > upper[i] {
                return false
            }
    
            if ip[i] == lower[i] {
                if lowerBoundary {
                    lowerBoundary = true
                } else {
                    lowerBoundary = false
                }
                //lowerBoundary &= true
            } else {
                lowerBoundary = false
                //lowerBoundary &= false
            }
    
            if ip[i] == upper[i] {
                //fmt.Printf("matched upper\n")
                if upperBoundary {
                    upperBoundary = true
                } else {
                    upperBoundary = false
                }
                //upperBoundary &= true
            } else {
                upperBoundary = false
                //upperBoundary &= false
            }
        }
        return true
    }
    

    My results:

    === RUN TestIPRangeTime
    ELAPSED time port:  1.0001ms
    ELAPSED time bytescompare:  2.0001ms
    --- PASS: TestIPRangeTime (0.00 seconds)
    
    === RUN TestIPRangeTime
    ELAPSED time port:  1ms
    ELAPSED time bytescompare:  2.0002ms
    --- PASS: TestIPRangeTime (0.00 seconds)
    
    === RUN TestIPRangeTime
    ELAPSED time port:  1.0001ms
    ELAPSED time bytescompare:  2.0001ms
    --- PASS: TestIPRangeTime (0.00 seconds)
    
    === RUN TestIPRangeTime
    ELAPSED time port:  1.0001ms
    ELAPSED time bytescompare:  2.0001ms
    --- PASS: TestIPRangeTime (0.00 seconds)
    

提交回复
热议问题