github.com/phuslu/lru@v1.0.16-0.20240421170520-46288a2fd47c/wyhash.go (about)

     1  // Code generated by golang.org/x/tools/cmd/bundle. DO NOT EDIT.
     2  //go:generate bundle -o wyhash.go github.com/zeebo/wyhash
     3  
     4  package lru
     5  
     6  import (
     7  	"encoding/binary"
     8  	"math/bits"
     9  	"unsafe"
    10  )
    11  
    12  type (
    13  	wyhash_ptr  = unsafe.Pointer
    14  	wyhash_uptr = uintptr
    15  
    16  	wyhash_u32 = uint32
    17  	wyhash_u64 = uint64
    18  )
    19  
    20  const (
    21  	wyhash__wyp0 = 0xa0761d6478bd642f
    22  	wyhash__wyp1 = 0xe7037ed1a0b428db
    23  	wyhash__wyp2 = 0x8ebc6af09c88c6e3
    24  	wyhash__wyp3 = 0x589965cc75374cc3
    25  	wyhash__wyp4 = 0x1d8e4e27c47d124f
    26  )
    27  
    28  func wyhash_i(p wyhash_ptr, n wyhash_uptr) wyhash_ptr { return wyhash_ptr(wyhash_uptr(p) + n) }
    29  
    30  func wyhash__wymum(A, B wyhash_u64) wyhash_u64 {
    31  	hi, lo := bits.Mul64(A, B)
    32  	return hi ^ lo
    33  }
    34  
    35  func wyhash__wyr8(p wyhash_ptr) wyhash_u64 {
    36  	return binary.LittleEndian.Uint64((*[8]byte)(p)[:])
    37  }
    38  
    39  func wyhash__wyr4(p wyhash_ptr) wyhash_u64 {
    40  	return wyhash_u64(binary.LittleEndian.Uint32((*[4]byte)(p)[:]))
    41  }
    42  
    43  func wyhash__wyr3(p wyhash_ptr, k wyhash_uptr) wyhash_u64 {
    44  	b0 := wyhash_u64(*(*byte)(p))
    45  	b1 := wyhash_u64(*(*byte)(wyhash_i(p, k>>1)))
    46  	b2 := wyhash_u64(*(*byte)(wyhash_i(p, k-1)))
    47  	return b0<<16 | b1<<8 | b2
    48  }
    49  
    50  func wyhash__wyr9(p wyhash_ptr) wyhash_u64 {
    51  	b := (*[8]byte)(p)
    52  	return wyhash_u64(wyhash_u32(b[0])|wyhash_u32(b[1])<<8|wyhash_u32(b[2])<<16|wyhash_u32(b[3])<<24)<<32 |
    53  		wyhash_u64(wyhash_u32(b[4])|wyhash_u32(b[5])<<8|wyhash_u32(b[6])<<16|wyhash_u32(b[7])<<24)
    54  }
    55  
    56  func wyhash_hash(data string, seed wyhash_u64) wyhash_u64 {
    57  	p, len := *(*wyhash_ptr)(wyhash_ptr(&data)), wyhash_uptr(len(data))
    58  	see1, off := seed, len
    59  
    60  	switch {
    61  	case len <= 0x03:
    62  		return wyhash__wymum(wyhash__wymum(wyhash__wyr3(p, len)^seed^wyhash__wyp0, seed^wyhash__wyp1)^seed, wyhash_u64(len)^wyhash__wyp4)
    63  
    64  	case len <= 0x08:
    65  		return wyhash__wymum(wyhash__wymum(wyhash__wyr4(wyhash_i(p, 0x00))^seed^wyhash__wyp0, wyhash__wyr4(wyhash_i(p, len-0x04))^seed^wyhash__wyp1)^seed, wyhash_u64(len)^wyhash__wyp4)
    66  
    67  	case len <= 0x10:
    68  		return wyhash__wymum(wyhash__wymum(wyhash__wyr9(wyhash_i(p, 0x00))^seed^wyhash__wyp0, wyhash__wyr9(wyhash_i(p, len-0x08))^seed^wyhash__wyp1)^seed, wyhash_u64(len)^wyhash__wyp4)
    69  
    70  	case len <= 0x18:
    71  		return wyhash__wymum(wyhash__wymum(wyhash__wyr9(wyhash_i(p, 0x00))^seed^wyhash__wyp0, wyhash__wyr9(wyhash_i(p, 0x08))^seed^wyhash__wyp1)^wyhash__wymum(wyhash__wyr9(wyhash_i(p, len-0x08))^seed^wyhash__wyp2, seed^wyhash__wyp3), wyhash_u64(len)^wyhash__wyp4)
    72  
    73  	case len <= 0x20:
    74  		return wyhash__wymum(wyhash__wymum(wyhash__wyr9(wyhash_i(p, 0x00))^seed^wyhash__wyp0, wyhash__wyr9(wyhash_i(p, 0x08))^seed^wyhash__wyp1)^wyhash__wymum(wyhash__wyr9(wyhash_i(p, 0x10))^seed^wyhash__wyp2, wyhash__wyr9(wyhash_i(p, len-0x08))^seed^wyhash__wyp3), wyhash_u64(len)^wyhash__wyp4)
    75  
    76  	case len <= 0x100:
    77  		seed = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x00))^seed^wyhash__wyp0, wyhash__wyr8(wyhash_i(p, 0x08))^seed^wyhash__wyp1)
    78  		see1 = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x10))^see1^wyhash__wyp2, wyhash__wyr8(wyhash_i(p, 0x18))^see1^wyhash__wyp3)
    79  		if len > 0x40 {
    80  			seed = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x20))^seed^wyhash__wyp0, wyhash__wyr8(wyhash_i(p, 0x28))^seed^wyhash__wyp1)
    81  			see1 = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x30))^see1^wyhash__wyp2, wyhash__wyr8(wyhash_i(p, 0x38))^see1^wyhash__wyp3)
    82  			if len > 0x60 {
    83  				seed = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x40))^seed^wyhash__wyp0, wyhash__wyr8(wyhash_i(p, 0x48))^seed^wyhash__wyp1)
    84  				see1 = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x50))^see1^wyhash__wyp2, wyhash__wyr8(wyhash_i(p, 0x58))^see1^wyhash__wyp3)
    85  				if len > 0x80 {
    86  					seed = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x60))^seed^wyhash__wyp0, wyhash__wyr8(wyhash_i(p, 0x68))^seed^wyhash__wyp1)
    87  					see1 = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x70))^see1^wyhash__wyp2, wyhash__wyr8(wyhash_i(p, 0x78))^see1^wyhash__wyp3)
    88  					if len > 0xa0 {
    89  						seed = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x80))^seed^wyhash__wyp0, wyhash__wyr8(wyhash_i(p, 0x88))^seed^wyhash__wyp1)
    90  						see1 = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x90))^see1^wyhash__wyp2, wyhash__wyr8(wyhash_i(p, 0x98))^see1^wyhash__wyp3)
    91  						if len > 0xc0 {
    92  							seed = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0xa0))^seed^wyhash__wyp0, wyhash__wyr8(wyhash_i(p, 0xa8))^seed^wyhash__wyp1)
    93  							see1 = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0xb0))^see1^wyhash__wyp2, wyhash__wyr8(wyhash_i(p, 0xb8))^see1^wyhash__wyp3)
    94  							if len > 0xe0 {
    95  								seed = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0xc0))^seed^wyhash__wyp0, wyhash__wyr8(wyhash_i(p, 0xc8))^seed^wyhash__wyp1)
    96  								see1 = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0xd0))^see1^wyhash__wyp2, wyhash__wyr8(wyhash_i(p, 0xd8))^see1^wyhash__wyp3)
    97  							}
    98  						}
    99  					}
   100  				}
   101  			}
   102  		}
   103  
   104  		off = (off-1)%0x20 + 1
   105  		p = wyhash_i(p, len-off)
   106  
   107  	default:
   108  		for ; off > 0x100; off, p = off-0x100, wyhash_i(p, 0x100) {
   109  			seed = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x00))^seed^wyhash__wyp0, wyhash__wyr8(wyhash_i(p, 0x08))^seed^wyhash__wyp1) ^ wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x10))^seed^wyhash__wyp2, wyhash__wyr8(wyhash_i(p, 0x18))^seed^wyhash__wyp3)
   110  			see1 = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x20))^see1^wyhash__wyp1, wyhash__wyr8(wyhash_i(p, 0x28))^see1^wyhash__wyp2) ^ wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x30))^see1^wyhash__wyp3, wyhash__wyr8(wyhash_i(p, 0x38))^see1^wyhash__wyp0)
   111  			seed = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x40))^seed^wyhash__wyp0, wyhash__wyr8(wyhash_i(p, 0x48))^seed^wyhash__wyp1) ^ wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x50))^seed^wyhash__wyp2, wyhash__wyr8(wyhash_i(p, 0x58))^seed^wyhash__wyp3)
   112  			see1 = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x60))^see1^wyhash__wyp1, wyhash__wyr8(wyhash_i(p, 0x68))^see1^wyhash__wyp2) ^ wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x70))^see1^wyhash__wyp3, wyhash__wyr8(wyhash_i(p, 0x78))^see1^wyhash__wyp0)
   113  			seed = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x80))^seed^wyhash__wyp0, wyhash__wyr8(wyhash_i(p, 0x88))^seed^wyhash__wyp1) ^ wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x90))^seed^wyhash__wyp2, wyhash__wyr8(wyhash_i(p, 0x98))^seed^wyhash__wyp3)
   114  			see1 = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0xa0))^see1^wyhash__wyp1, wyhash__wyr8(wyhash_i(p, 0xa8))^see1^wyhash__wyp2) ^ wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0xb0))^see1^wyhash__wyp3, wyhash__wyr8(wyhash_i(p, 0xb8))^see1^wyhash__wyp0)
   115  			seed = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0xc0))^seed^wyhash__wyp0, wyhash__wyr8(wyhash_i(p, 0xc8))^seed^wyhash__wyp1) ^ wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0xd0))^seed^wyhash__wyp2, wyhash__wyr8(wyhash_i(p, 0xd8))^seed^wyhash__wyp3)
   116  			see1 = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0xe0))^see1^wyhash__wyp1, wyhash__wyr8(wyhash_i(p, 0xe8))^see1^wyhash__wyp2) ^ wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0xf0))^see1^wyhash__wyp3, wyhash__wyr8(wyhash_i(p, 0xf8))^see1^wyhash__wyp0)
   117  		}
   118  		for ; off > 0x20; off, p = off-0x20, wyhash_i(p, 0x20) {
   119  			seed = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x00))^seed^wyhash__wyp0, wyhash__wyr8(wyhash_i(p, 0x08))^seed^wyhash__wyp1)
   120  			see1 = wyhash__wymum(wyhash__wyr8(wyhash_i(p, 0x10))^see1^wyhash__wyp2, wyhash__wyr8(wyhash_i(p, 0x18))^see1^wyhash__wyp3)
   121  		}
   122  	}
   123  
   124  	switch {
   125  	case off > 0x18:
   126  		seed = wyhash__wymum(wyhash__wyr9(wyhash_i(p, 0x00))^seed^wyhash__wyp0, wyhash__wyr9(wyhash_i(p, 0x08))^seed^wyhash__wyp1)
   127  		see1 = wyhash__wymum(wyhash__wyr9(wyhash_i(p, 0x10))^see1^wyhash__wyp2, wyhash__wyr9(wyhash_i(p, off-0x08))^see1^wyhash__wyp3)
   128  
   129  	case off > 0x10:
   130  		seed = wyhash__wymum(wyhash__wyr9(wyhash_i(p, 0x00))^seed^wyhash__wyp0, wyhash__wyr9(wyhash_i(p, 0x08))^seed^wyhash__wyp1)
   131  		see1 = wyhash__wymum(wyhash__wyr9(wyhash_i(p, off-0x08))^see1^wyhash__wyp2, see1^wyhash__wyp3)
   132  
   133  	case off > 0x08:
   134  		seed = wyhash__wymum(wyhash__wyr9(wyhash_i(p, 0x00))^seed^wyhash__wyp0, wyhash__wyr9(wyhash_i(p, off-0x08))^seed^wyhash__wyp1)
   135  
   136  	case off > 0x03:
   137  		seed = wyhash__wymum(wyhash__wyr4(wyhash_i(p, 0x00))^seed^wyhash__wyp0, wyhash__wyr4(wyhash_i(p, off-0x04))^seed^wyhash__wyp1)
   138  
   139  	default:
   140  		seed = wyhash__wymum(wyhash__wyr3(p, off)^seed^wyhash__wyp0, seed^wyhash__wyp1)
   141  	}
   142  
   143  	return wyhash__wymum(seed^see1, wyhash_u64(len)^wyhash__wyp4)
   144  }