2020-07-13 15:07:56 +08:00
|
|
|
//通过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))
|
|
|
|
|
}
|
|
|
|
|
|
2020-07-14 11:55:40 +08:00
|
|
|
//这边模的结果是从0开始到mod-1:即范围为 [0,mod)。可以做相应改进
|
2020-07-13 15:07:56 +08:00
|
|
|
func Crc32Mode(s string, mod int) int {
|
|
|
|
|
u := crc32Change(s)
|
|
|
|
|
return int(u) % mod
|
|
|
|
|
}
|