mirror of
https://github.com/nadoo/glider.git
synced 2025-02-24 01:45:39 +08:00
54 lines
1007 B
Go
54 lines
1007 B
Go
package tools
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"unsafe"
|
|
)
|
|
|
|
func IsLittleEndian() bool {
|
|
const N int = int(unsafe.Sizeof(0))
|
|
x := 0x1234
|
|
p := unsafe.Pointer(&x)
|
|
p2 := (*[N]byte)(p)
|
|
if p2[0] == 0 {
|
|
return false
|
|
} else {
|
|
return true
|
|
}
|
|
}
|
|
|
|
type Shift128plusContext struct {
|
|
v [2]uint64
|
|
}
|
|
|
|
func (ctx *Shift128plusContext) InitFromBin(bin []byte) {
|
|
var fillBin [16]byte
|
|
copy(fillBin[:], bin)
|
|
|
|
ctx.v[0] = binary.LittleEndian.Uint64(fillBin[:8])
|
|
ctx.v[1] = binary.LittleEndian.Uint64(fillBin[8:])
|
|
}
|
|
|
|
func (ctx *Shift128plusContext) InitFromBinDatalen(bin []byte, datalen int) {
|
|
var fillBin [16]byte
|
|
copy(fillBin[:], bin)
|
|
binary.LittleEndian.PutUint16(fillBin[:2], uint16(datalen))
|
|
|
|
ctx.v[0] = binary.LittleEndian.Uint64(fillBin[:8])
|
|
ctx.v[1] = binary.LittleEndian.Uint64(fillBin[8:])
|
|
|
|
for i := 0; i < 4; i++ {
|
|
ctx.Next()
|
|
}
|
|
}
|
|
|
|
func (ctx *Shift128plusContext) Next() uint64 {
|
|
x := ctx.v[0]
|
|
y := ctx.v[1]
|
|
ctx.v[0] = y
|
|
x ^= x << 23
|
|
x ^= y ^ (x >> 17) ^ (y >> 26)
|
|
ctx.v[1] = x
|
|
return x + y
|
|
}
|