From 07b1c388bae416a749ceb7d143ac33c3d27e4a53 Mon Sep 17 00:00:00 2001 From: huangzj Date: Mon, 13 Jul 2020 15:07:56 +0800 Subject: [PATCH] =?UTF-8?q?feat(Go-Tool)=EF=BC=9A=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E8=8E=B7=E5=8F=96=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?=E5=93=88=E5=B8=8C=E5=80=BC=E7=9A=84=E6=96=B9=E6=B3=95(?= =?UTF-8?q?=E8=BF=99=E4=B8=AA=E6=98=AF=E4=B9=8B=E5=89=8D=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=E5=81=9A=E5=88=86=E8=A1=A8=E7=B3=BB=E7=BB=9F=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E6=90=AC=E5=88=B0=E8=BF=99=E8=BE=B9=E6=9D=A5?= =?UTF-8?q?=E7=9C=8B=E4=B8=80=E4=B8=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 2 ++ test/HashMod_test.go | 27 ++++++++++++++++++++++++++ util/HashModUtil.go | 46 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 test/HashMod_test.go create mode 100644 util/HashModUtil.go diff --git a/readme.md b/readme.md index 8112c33..6317a4e 100644 --- a/readme.md +++ b/readme.md @@ -26,6 +26,8 @@ 2020/7/8: 增加读取json文件方法及其单测类 +2020/7/13: 增加计算获取字符串哈希值的方法(这个是之前用于做分表系统的方法,搬到这边来看一下) + # mod vendor模式加载包 通过go mod的方式加载的github上面的包会有报红的问题,但是包本身是可以运行的,这样就是会有一个问题,如果你想要点击去看方法的内容,没办法做到 diff --git a/test/HashMod_test.go b/test/HashMod_test.go new file mode 100644 index 0000000..41d7c03 --- /dev/null +++ b/test/HashMod_test.go @@ -0,0 +1,27 @@ +/* + * @Author : huangzj + * @Time : 2020/7/13 11:33 + * @Description: + */ + +package test + +import ( + "Go-Tool/util" + "fmt" + "testing" +) + +//不同方式获取哈希值,结果相差挺大,从输出的结果可以非常直观的看出 +func TestHashMode(t *testing.T) { + fmt.Println(util.UseBigIntMod("3213444658987654", 9999999)) + //因为big.Int只能接受大数,所以如果这边传入字符串没办法转换成功,会发生报错 + //fmt.Println(util.UseBigIntMod("asdsadasdasdas", 20)) + fmt.Println(util.Mod("3213444658987654", 9999999)) + fmt.Println(util.Crc32Mode("3213444658987654", 9999999)) + + fmt.Println() + + fmt.Println(util.Mod("asdsadasdasdas", 9999999)) + fmt.Println(util.Crc32Mode("asdsadasdasdas", 9999999)) +} diff --git a/util/HashModUtil.go b/util/HashModUtil.go new file mode 100644 index 0000000..8f77146 --- /dev/null +++ b/util/HashModUtil.go @@ -0,0 +1,46 @@ +//通过hash算法获取字符串对应的哈希值 +package util + +import ( + "bytes" + "hash/crc32" + "math/big" +) + +func bigInt(s string) (*big.Int, bool) { + bInt := new(big.Int) + return bInt.SetString(s, 10) +} + +func UseBigIntMod(s string, mod int) int64 { + b, br := bigInt(s) + if !br { + panic("该方法只可用于大数mod计算") + } + + result := b.Mod(b, new(big.Int).SetInt64(int64(mod))) + return result.Int64() +} + +func calBytesSum(s string) int { + var sum int + for _, b1 := range bytes.NewBufferString(s).Bytes() { + sum = sum + int(b1) + } + + return sum +} + +func Mod(s string, mod int) int { + sum := calBytesSum(s) + return sum % mod +} + +func crc32Change(s string) uint32 { + return crc32.ChecksumIEEE([]byte(s)) +} + +func Crc32Mode(s string, mod int) int { + u := crc32Change(s) + return int(u) % mod +}