測試日常雜談(3)
阿新 • • 發佈:2022-05-13
https://github.com/wangyi-fudan/wyhash
runtime\stubs.go
//go:nosplit func fastrand() uint32 { mp := getg().m // Implement wyrand: https://github.com/wangyi-fudan/wyhash // Only the platform that math.Mul64 can be lowered // by the compiler should be in this list. if goarch.IsAmd64|goarch.IsArm64|goarch.IsPpc64| goarch.IsPpc64le|goarch.IsMips64|goarch.IsMips64le| goarch.IsS390x|goarch.IsRiscv64 == 1 { mp.fastrand += 0xa0761d6478bd642f hi, lo := math.Mul64(mp.fastrand, mp.fastrand^0xe7037ed1a0b428db) return uint32(hi ^ lo) } // Implement xorshift64+: 2 32-bit xorshift sequences added together. // Shift triplet [17,7,16] was calculated as indicated in Marsaglia's // Xorshift paper: https://www.jstatsoft.org/article/view/v008i14/xorshift.pdf // This generator passes the SmallCrush suite, part of TestU01 framework: // http://simul.iro.umontreal.ca/testu01/tu01.html t := (*[2]uint32)(unsafe.Pointer(&mp.fastrand)) s1, s0 := t[0], t[1] s1 ^= s1 << 17 s1 = s1 ^ s0 ^ s1>>7 ^ s0>>16 t[0], t[1] = s0, s1 return s0 + s1 }