md5随机性验证

本测试旨在测试md5编码之后的数据hash随机性,以验证ZCache各节点数据分布的均匀性

测试代码如下

package main

import (
    "crypto/md5"
    "encoding/hex"
    "fmt"
    "math/rand"
    "sort"
    "strconv"
)

func main() {

    var lenArray []int64 = []int64{16384, 32768, 65536}
    for _, testLen := range lenArray {
        gCount := make([]int64, testLen)
        for i := 0; i < 10000000; i++ {
            msg := randSeq(10)
            idx, err := GetHashIndex(msg, testLen)
            if err != nil {
                continue
            }
            if 0 == i%1000 {
                //fmt.Println("curIndex ", i)
            }
            gCount[idx]++
        }

        var i int64 = 0
        var max int64 = 0
        var min int64 = 10000000
        var floatCountArr []float64
        for ; i < testLen; i++ {
            if gCount[i] > max {
                max = gCount[i]
            }
            if gCount[i] < min {
                min = gCount[i]
            }
            strCount := strconv.FormatInt(gCount[i], 10)
            floatCount, _ := strconv.ParseFloat(strCount, 64)
            floatCountArr = append(floatCountArr, floatCount)
        }

        sort.Float64s(floatCountArr)
        fmt.Println("Len", testLen, "Max", uint64(floatCountArr[testLen-1]), "Min", uint64(floatCountArr[0]), "Mid", uint64(floatCountArr[testLen/2]))
    }

}
func GetHashIndex(msg string, size int64) (int64, error) {
    msgByte := Md5Encode(msg)
    msgByte = msgByte[0 : len(msgByte)/2-1]
    data, err := ByteToInt(msgByte)
    if err != nil {
        return -1, err
    }
    data = data % size
    return data, nil
}

func Md5Encode(msg string) []byte {
    Md5Inst := md5.New()
    Md5Inst.Write([]byte(msg))
    result := Md5Inst.Sum([]byte(""))
    return result
}

func ByteToInt(msg []byte) (int64, error) {
    encodedStr := "0x" + hex.EncodeToString(msg)
    data, err := strconv.ParseInt(encodedStr, 0, 64)
    if err != nil {
        return -1, err
    }
    return data, nil
}

var letters = []rune("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")

func randSeq(n int) string {
    b := make([]rune, n)
    for i := range b {
        b[i] = letters[rand.Intn(len(letters))]
    }
    return string(b)
}


测试结果
Len 2 Max 5000044 Min 4999956 Mid 5000044
Len 4 Max 2500974 Min 2499376 Mid 2500112
Len 8 Max 1253127 Min 1247961 Mid 1249557
Len 16 Max 626016 Min 623809 Mid 625199
Len 32 Max 313527 Min 311180 Mid 312571
Len 64 Max 157193 Min 155134 Mid 156302
Len 128 Max 78929 Min 77217 Mid 78124
Len 256 Max 39737 Min 38492 Mid 39078
Len 512 Max 19983 Min 19036 Mid 19526
Len 1024 Max 10125 Min 9455 Mid 9768
Len 2048 Max 5172 Min 4659 Mid 4882
Len 4096 Max 2611 Min 2248 Mid 2441
Len 8192 Max 1339 Min 1080 Mid 1221
Len 16384 Max 720 Min 511 Mid 610
Len 32768 Max 382 Min 223 Mid 305
Len 65536 Max 207 Min 106 Mid 152
原文地址:https://www.cnblogs.com/zengyjun/p/10133350.html