// +build !appengine // This file encapsulates usage of unsafe. // xxhash_safe.go contains the safe implementations. package xxhash import ( "reflect" "unsafe" ) // Sum64String computes the 64-bit xxHash digest of s. // It may be faster than Sum64([]byte(s)) by avoiding a copy. // // TODO(caleb): Consider removing this if an optimization is ever added to make // it unnecessary: https://golang.org/issue/2205. // // TODO(caleb): We still have a function call; we could instead write Go/asm // copies of Sum64 for strings to squeeze out a bit more speed. func Sum64String(s string) uint64 { // See https://groups.google.com/d/msg/golang-nuts/dcjzJy-bSpw/tcZYBzQqAQAJ // for some discussion about this unsafe conversion. var b []byte bh := (*reflect.SliceHeader)(unsafe.Pointer(&b)) bh.Data = (*reflect.StringHeader)(unsafe.Pointer(&s)).Data bh.Len = len(s) bh.Cap = len(s) return Sum64(b) }