github.com/waltonchain/waltonchain_gwtc_src@v1.1.4-0.20201225072101-8a298c95a819/crypto/x11/jhash/jhash.go (about) 1 // Use of this source code is governed by an ISC 2 // license that can be found in the LICENSE file. 3 4 package jhash 5 6 import ( 7 "fmt" 8 9 "github.com/wtc/go-wtc/crypto/hash" 10 ) 11 12 // HashSize holds the size of a hash in bytes. 13 const HashSize = int(64) 14 15 // BlockSize holds the size of a block in bytes. 16 const BlockSize = uintptr(64) 17 18 //////////////// 19 20 type digest struct { 21 ptr uintptr 22 cnt uintptr 23 24 h [16]uint64 25 26 b [BlockSize]byte 27 } 28 29 // New returns a new digest compute a JH512 hash. 30 func New() hash.Digest { 31 ref := &digest{} 32 ref.Reset() 33 return ref 34 } 35 36 //////////////// 37 38 // Reset resets the digest to its initial state. 39 func (ref *digest) Reset() { 40 ref.ptr = 0 41 ref.cnt = 0 42 copy(ref.h[:], kInit[:]) 43 } 44 45 // Sum appends the current hash to dst and returns the result 46 // as a slice. It does not change the underlying hash state. 47 func (ref *digest) Sum(dst []byte) []byte { 48 dgt := *ref 49 hsh := [64]byte{} 50 dgt.Close(hsh[:], 0, 0) 51 return append(dst, hsh[:]...) 52 } 53 54 // Write more data to the running hash, never returns an error. 55 func (ref *digest) Write(src []byte) (int, error) { 56 sln := uintptr(len(src)) 57 fln := len(src) 58 buf := ref.b[:] 59 ptr := ref.ptr 60 61 if sln < (BlockSize - ptr) { 62 copy(buf[ptr:], src) 63 ref.ptr += sln 64 return int(sln), nil 65 } 66 67 var hi, lo [8]uint64 68 hi[0] = ref.h[0x0] 69 lo[0] = ref.h[0x1] 70 hi[1] = ref.h[0x2] 71 lo[1] = ref.h[0x3] 72 hi[2] = ref.h[0x4] 73 lo[2] = ref.h[0x5] 74 hi[3] = ref.h[0x6] 75 lo[3] = ref.h[0x7] 76 hi[4] = ref.h[0x8] 77 lo[4] = ref.h[0x9] 78 hi[5] = ref.h[0xA] 79 lo[5] = ref.h[0xB] 80 hi[6] = ref.h[0xC] 81 lo[6] = ref.h[0xD] 82 hi[7] = ref.h[0xE] 83 lo[7] = ref.h[0xF] 84 85 for sln > 0 { 86 cln := BlockSize - ptr 87 88 if cln > sln { 89 cln = sln 90 } 91 sln -= cln 92 93 copy(ref.b[ptr:], src[:cln]) 94 src = src[cln:] 95 ptr += cln 96 97 if ptr == BlockSize { 98 m0h := decUInt64le(buf[0:]) 99 m0l := decUInt64le(buf[8:]) 100 m1h := decUInt64le(buf[16:]) 101 m1l := decUInt64le(buf[24:]) 102 m2h := decUInt64le(buf[32:]) 103 m2l := decUInt64le(buf[40:]) 104 m3h := decUInt64le(buf[48:]) 105 m3l := decUInt64le(buf[56:]) 106 107 hi[0] ^= m0h 108 lo[0] ^= m0l 109 hi[1] ^= m1h 110 lo[1] ^= m1l 111 hi[2] ^= m2h 112 lo[2] ^= m2l 113 hi[3] ^= m3h 114 lo[3] ^= m3l 115 116 for r := uint64(0); r < 42; r += 7 { 117 slMutateExtend(r+0, 0, hi[:], lo[:]) 118 slMutateExtend(r+1, 1, hi[:], lo[:]) 119 slMutateExtend(r+2, 2, hi[:], lo[:]) 120 slMutateExtend(r+3, 3, hi[:], lo[:]) 121 slMutateExtend(r+4, 4, hi[:], lo[:]) 122 slMutateExtend(r+5, 5, hi[:], lo[:]) 123 slMutateBasic(r+6, hi[:], lo[:]) 124 } 125 126 hi[4] ^= m0h 127 lo[4] ^= m0l 128 hi[5] ^= m1h 129 lo[5] ^= m1l 130 hi[6] ^= m2h 131 lo[6] ^= m2l 132 hi[7] ^= m3h 133 lo[7] ^= m3l 134 135 ref.cnt++ 136 ptr = 0 137 } 138 } 139 140 ref.h[0x0] = hi[0] 141 ref.h[0x1] = lo[0] 142 ref.h[0x2] = hi[1] 143 ref.h[0x3] = lo[1] 144 ref.h[0x4] = hi[2] 145 ref.h[0x5] = lo[2] 146 ref.h[0x6] = hi[3] 147 ref.h[0x7] = lo[3] 148 ref.h[0x8] = hi[4] 149 ref.h[0x9] = lo[4] 150 ref.h[0xA] = hi[5] 151 ref.h[0xB] = lo[5] 152 ref.h[0xC] = hi[6] 153 ref.h[0xD] = lo[6] 154 ref.h[0xE] = hi[7] 155 ref.h[0xF] = lo[7] 156 157 ref.ptr = ptr 158 return fln, nil 159 } 160 161 // Close the digest by writing the last bits and storing the hash 162 // in dst. This prepares the digest for reuse by calling reset. A call 163 // to Close with a dst that is smaller then HashSize will return an error. 164 func (ref *digest) Close(dst []byte, bits uint8, bcnt uint8) error { 165 if ln := len(dst); HashSize > ln { 166 return fmt.Errorf("JHash Close: dst min length: %d, got %d", HashSize, ln) 167 } 168 169 var ocnt uintptr 170 var buf [128]uint8 171 172 { 173 off := uint8(0x80) >> bcnt 174 buf[0] = uint8((bits & -off) | off) 175 } 176 177 if ref.ptr == 0 && bcnt == 0 { 178 ocnt = 47 179 } else { 180 ocnt = 111 - ref.ptr 181 } 182 183 l0 := uint64(bcnt) 184 l0 += uint64(ref.cnt << 9) 185 l0 += uint64(ref.ptr << 3) 186 l1 := uint64(ref.cnt >> 55) 187 188 encUInt64be(buf[ocnt+1:], l1) 189 encUInt64be(buf[ocnt+9:], l0) 190 191 ref.Write(buf[:ocnt+17]) 192 193 for u := uintptr(0); u < 8; u++ { 194 encUInt64le(dst[(u<<3):], ref.h[u+8]) 195 } 196 197 ref.Reset() 198 return nil 199 } 200 201 // Size returns the number of bytes required to store the hash. 202 func (*digest) Size() int { 203 return HashSize 204 } 205 206 // BlockSize returns the block size of the hash. 207 func (*digest) BlockSize() int { 208 return int(BlockSize) 209 } 210 211 //////////////// 212 213 func decUInt64le(src []byte) uint64 { 214 return (uint64(src[0]) | 215 uint64(src[1])<<8 | 216 uint64(src[2])<<16 | 217 uint64(src[3])<<24 | 218 uint64(src[4])<<32 | 219 uint64(src[5])<<40 | 220 uint64(src[6])<<48 | 221 uint64(src[7])<<56) 222 } 223 224 func encUInt64le(dst []byte, src uint64) { 225 dst[0] = uint8(src) 226 dst[1] = uint8(src >> 8) 227 dst[2] = uint8(src >> 16) 228 dst[3] = uint8(src >> 24) 229 dst[4] = uint8(src >> 32) 230 dst[5] = uint8(src >> 40) 231 dst[6] = uint8(src >> 48) 232 dst[7] = uint8(src >> 56) 233 } 234 235 func encUInt64be(dst []byte, src uint64) { 236 dst[0] = uint8(src >> 56) 237 dst[1] = uint8(src >> 48) 238 dst[2] = uint8(src >> 40) 239 dst[3] = uint8(src >> 32) 240 dst[4] = uint8(src >> 24) 241 dst[5] = uint8(src >> 16) 242 dst[6] = uint8(src >> 8) 243 dst[7] = uint8(src) 244 } 245 246 func slMutateBasic(r uint64, hi, lo []uint64) { 247 var tmp uint64 248 249 tmp = kSpec[(r<<2)+0] 250 hi[6] = ^hi[6] 251 hi[0] ^= tmp & ^hi[4] 252 tmp = tmp ^ (hi[0] & hi[2]) 253 hi[0] ^= hi[4] & hi[6] 254 hi[6] ^= ^hi[2] & hi[4] 255 hi[2] ^= hi[0] & hi[4] 256 hi[4] ^= hi[0] & ^hi[6] 257 hi[0] ^= hi[2] | hi[6] 258 hi[6] ^= hi[2] & hi[4] 259 hi[2] ^= tmp & hi[0] 260 hi[4] ^= tmp 261 262 tmp = kSpec[(r<<2)+1] 263 lo[6] = ^lo[6] 264 lo[0] ^= tmp & ^lo[4] 265 tmp = tmp ^ (lo[0] & lo[2]) 266 lo[0] ^= lo[4] & lo[6] 267 lo[6] ^= ^lo[2] & lo[4] 268 lo[2] ^= lo[0] & lo[4] 269 lo[4] ^= lo[0] & ^lo[6] 270 lo[0] ^= lo[2] | lo[6] 271 lo[6] ^= lo[2] & lo[4] 272 lo[2] ^= tmp & lo[0] 273 lo[4] ^= tmp 274 275 tmp = kSpec[(r<<2)+2] 276 hi[7] = ^hi[7] 277 hi[1] ^= tmp & ^hi[5] 278 tmp = tmp ^ (hi[1] & hi[3]) 279 hi[1] ^= hi[5] & hi[7] 280 hi[7] ^= ^hi[3] & hi[5] 281 hi[3] ^= hi[1] & hi[5] 282 hi[5] ^= hi[1] & ^hi[7] 283 hi[1] ^= hi[3] | hi[7] 284 hi[7] ^= hi[3] & hi[5] 285 hi[3] ^= tmp & hi[1] 286 hi[5] ^= tmp 287 288 tmp = kSpec[(r<<2)+3] 289 lo[7] = ^lo[7] 290 lo[1] ^= tmp & ^lo[5] 291 tmp = tmp ^ (lo[1] & lo[3]) 292 lo[1] ^= lo[5] & lo[7] 293 lo[7] ^= ^lo[3] & lo[5] 294 lo[3] ^= lo[1] & lo[5] 295 lo[5] ^= lo[1] & ^lo[7] 296 lo[1] ^= lo[3] | lo[7] 297 lo[7] ^= lo[3] & lo[5] 298 lo[3] ^= tmp & lo[1] 299 lo[5] ^= tmp 300 301 hi[1] ^= hi[2] 302 hi[3] ^= hi[4] 303 hi[5] ^= hi[6] ^ hi[0] 304 hi[7] ^= hi[0] 305 hi[0] ^= hi[3] 306 hi[2] ^= hi[5] 307 hi[4] ^= hi[7] ^ hi[1] 308 hi[6] ^= hi[1] 309 310 lo[1] ^= lo[2] 311 lo[3] ^= lo[4] 312 lo[5] ^= lo[6] ^ lo[0] 313 lo[7] ^= lo[0] 314 lo[0] ^= lo[3] 315 lo[2] ^= lo[5] 316 lo[4] ^= lo[7] ^ lo[1] 317 lo[6] ^= lo[1] 318 319 tmp = hi[1] 320 hi[1] = lo[1] 321 lo[1] = tmp 322 323 tmp = hi[3] 324 hi[3] = lo[3] 325 lo[3] = tmp 326 327 tmp = hi[5] 328 hi[5] = lo[5] 329 lo[5] = tmp 330 331 tmp = hi[7] 332 hi[7] = lo[7] 333 lo[7] = tmp 334 } 335 336 func slMutateExtend(r, ro uint64, hi, lo []uint64) { 337 var tmp uint64 338 339 tmp = kSpec[(r<<2)+0] 340 hi[6] = ^hi[6] 341 hi[0] ^= tmp & ^hi[4] 342 tmp = tmp ^ (hi[0] & hi[2]) 343 hi[0] ^= hi[4] & hi[6] 344 hi[6] ^= ^hi[2] & hi[4] 345 hi[2] ^= hi[0] & hi[4] 346 hi[4] ^= hi[0] & ^hi[6] 347 hi[0] ^= hi[2] | hi[6] 348 hi[6] ^= hi[2] & hi[4] 349 hi[2] ^= tmp & hi[0] 350 hi[4] ^= tmp 351 352 tmp = kSpec[(r<<2)+1] 353 lo[6] = ^lo[6] 354 lo[0] ^= tmp & ^lo[4] 355 tmp = tmp ^ (lo[0] & lo[2]) 356 lo[0] ^= lo[4] & lo[6] 357 lo[6] ^= ^lo[2] & lo[4] 358 lo[2] ^= lo[0] & lo[4] 359 lo[4] ^= lo[0] & ^lo[6] 360 lo[0] ^= lo[2] | lo[6] 361 lo[6] ^= lo[2] & lo[4] 362 lo[2] ^= tmp & lo[0] 363 lo[4] ^= tmp 364 365 tmp = kSpec[(r<<2)+2] 366 hi[7] = ^hi[7] 367 hi[1] ^= tmp & ^hi[5] 368 tmp = tmp ^ (hi[1] & hi[3]) 369 hi[1] ^= hi[5] & hi[7] 370 hi[7] ^= ^hi[3] & hi[5] 371 hi[3] ^= hi[1] & hi[5] 372 hi[5] ^= hi[1] & ^hi[7] 373 hi[1] ^= hi[3] | hi[7] 374 hi[7] ^= hi[3] & hi[5] 375 hi[3] ^= tmp & hi[1] 376 hi[5] ^= tmp 377 378 tmp = kSpec[(r<<2)+3] 379 lo[7] = ^lo[7] 380 lo[1] ^= tmp & ^lo[5] 381 tmp = tmp ^ (lo[1] & lo[3]) 382 lo[1] ^= lo[5] & lo[7] 383 lo[7] ^= ^lo[3] & lo[5] 384 lo[3] ^= lo[1] & lo[5] 385 lo[5] ^= lo[1] & ^lo[7] 386 lo[1] ^= lo[3] | lo[7] 387 lo[7] ^= lo[3] & lo[5] 388 lo[3] ^= tmp & lo[1] 389 lo[5] ^= tmp 390 391 hi[1] ^= hi[2] 392 hi[3] ^= hi[4] 393 hi[5] ^= hi[6] ^ hi[0] 394 hi[7] ^= hi[0] 395 hi[0] ^= hi[3] 396 hi[2] ^= hi[5] 397 hi[4] ^= hi[7] ^ hi[1] 398 hi[6] ^= hi[1] 399 400 lo[1] ^= lo[2] 401 lo[3] ^= lo[4] 402 lo[5] ^= lo[6] ^ lo[0] 403 lo[7] ^= lo[0] 404 lo[0] ^= lo[3] 405 lo[2] ^= lo[5] 406 lo[4] ^= lo[7] ^ lo[1] 407 lo[6] ^= lo[1] 408 409 tmp = (hi[1] & (kWrapValue[ro])) << (kWrapOffset[ro]) 410 hi[1] = ((hi[1] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp 411 tmp = (lo[1] & (kWrapValue[ro])) << (kWrapOffset[ro]) 412 lo[1] = ((lo[1] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp 413 414 tmp = (hi[3] & (kWrapValue[ro])) << (kWrapOffset[ro]) 415 hi[3] = ((hi[3] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp 416 tmp = (lo[3] & (kWrapValue[ro])) << (kWrapOffset[ro]) 417 lo[3] = ((lo[3] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp 418 419 tmp = (hi[5] & (kWrapValue[ro])) << (kWrapOffset[ro]) 420 hi[5] = ((hi[5] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp 421 tmp = (lo[5] & (kWrapValue[ro])) << (kWrapOffset[ro]) 422 lo[5] = ((lo[5] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp 423 424 tmp = (hi[7] & (kWrapValue[ro])) << (kWrapOffset[ro]) 425 hi[7] = ((hi[7] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp 426 tmp = (lo[7] & (kWrapValue[ro])) << (kWrapOffset[ro]) 427 lo[7] = ((lo[7] >> (kWrapOffset[ro])) & (kWrapValue[ro])) | tmp 428 } 429 430 //////////////// 431 432 var kInit = []uint64{ 433 uint64(0x17aa003e964bd16f), uint64(0x43d5157a052e6a63), 434 uint64(0x0bef970c8d5e228a), uint64(0x61c3b3f2591234e9), 435 uint64(0x1e806f53c1a01d89), uint64(0x806d2bea6b05a92a), 436 uint64(0xa6ba7520dbcc8e58), uint64(0xf73bf8ba763a0fa9), 437 uint64(0x694ae34105e66901), uint64(0x5ae66f2e8e8ab546), 438 uint64(0x243c84c1d0a74710), uint64(0x99c15a2db1716e3b), 439 uint64(0x56f8b19decf657cf), uint64(0x56b116577c8806a7), 440 uint64(0xfb1785e6dffcc2e3), uint64(0x4bdd8ccc78465a54), 441 } 442 443 var kSpec = []uint64{ 444 uint64(0x67f815dfa2ded572), uint64(0x571523b70a15847b), 445 uint64(0xf6875a4d90d6ab81), uint64(0x402bd1c3c54f9f4e), 446 uint64(0x9cfa455ce03a98ea), uint64(0x9a99b26699d2c503), 447 uint64(0x8a53bbf2b4960266), uint64(0x31a2db881a1456b5), 448 uint64(0xdb0e199a5c5aa303), uint64(0x1044c1870ab23f40), 449 uint64(0x1d959e848019051c), uint64(0xdccde75eadeb336f), 450 uint64(0x416bbf029213ba10), uint64(0xd027bbf7156578dc), 451 uint64(0x5078aa3739812c0a), uint64(0xd3910041d2bf1a3f), 452 uint64(0x907eccf60d5a2d42), uint64(0xce97c0929c9f62dd), 453 uint64(0xac442bc70ba75c18), uint64(0x23fcc663d665dfd1), 454 uint64(0x1ab8e09e036c6e97), uint64(0xa8ec6c447e450521), 455 uint64(0xfa618e5dbb03f1ee), uint64(0x97818394b29796fd), 456 uint64(0x2f3003db37858e4a), uint64(0x956a9ffb2d8d672a), 457 uint64(0x6c69b8f88173fe8a), uint64(0x14427fc04672c78a), 458 uint64(0xc45ec7bd8f15f4c5), uint64(0x80bb118fa76f4475), 459 uint64(0xbc88e4aeb775de52), uint64(0xf4a3a6981e00b882), 460 uint64(0x1563a3a9338ff48e), uint64(0x89f9b7d524565faa), 461 uint64(0xfde05a7c20edf1b6), uint64(0x362c42065ae9ca36), 462 uint64(0x3d98fe4e433529ce), uint64(0xa74b9a7374f93a53), 463 uint64(0x86814e6f591ff5d0), uint64(0x9f5ad8af81ad9d0e), 464 uint64(0x6a6234ee670605a7), uint64(0x2717b96ebe280b8b), 465 uint64(0x3f1080c626077447), uint64(0x7b487ec66f7ea0e0), 466 uint64(0xc0a4f84aa50a550d), uint64(0x9ef18e979fe7e391), 467 uint64(0xd48d605081727686), uint64(0x62b0e5f3415a9e7e), 468 uint64(0x7a205440ec1f9ffc), uint64(0x84c9f4ce001ae4e3), 469 uint64(0xd895fa9df594d74f), uint64(0xa554c324117e2e55), 470 uint64(0x286efebd2872df5b), uint64(0xb2c4a50fe27ff578), 471 uint64(0x2ed349eeef7c8905), uint64(0x7f5928eb85937e44), 472 uint64(0x4a3124b337695f70), uint64(0x65e4d61df128865e), 473 uint64(0xe720b95104771bc7), uint64(0x8a87d423e843fe74), 474 uint64(0xf2947692a3e8297d), uint64(0xc1d9309b097acbdd), 475 uint64(0xe01bdc5bfb301b1d), uint64(0xbf829cf24f4924da), 476 uint64(0xffbf70b431bae7a4), uint64(0x48bcf8de0544320d), 477 uint64(0x39d3bb5332fcae3b), uint64(0xa08b29e0c1c39f45), 478 uint64(0x0f09aef7fd05c9e5), uint64(0x34f1904212347094), 479 uint64(0x95ed44e301b771a2), uint64(0x4a982f4f368e3be9), 480 uint64(0x15f66ca0631d4088), uint64(0xffaf52874b44c147), 481 uint64(0x30c60ae2f14abb7e), uint64(0xe68c6eccc5b67046), 482 uint64(0x00ca4fbd56a4d5a4), uint64(0xae183ec84b849dda), 483 uint64(0xadd1643045ce5773), uint64(0x67255c1468cea6e8), 484 uint64(0x16e10ecbf28cdaa3), uint64(0x9a99949a5806e933), 485 uint64(0x7b846fc220b2601f), uint64(0x1885d1a07facced1), 486 uint64(0xd319dd8da15b5932), uint64(0x46b4a5aac01c9a50), 487 uint64(0xba6b04e467633d9f), uint64(0x7eee560bab19caf6), 488 uint64(0x742128a9ea79b11f), uint64(0xee51363b35f7bde9), 489 uint64(0x76d350755aac571d), uint64(0x01707da3fec2463a), 490 uint64(0x42d8a498afc135f7), uint64(0x79676b9e20eced78), 491 uint64(0xa8db3aea15638341), uint64(0x832c83324d3bc3fa), 492 uint64(0xf347271c1f3b40a7), uint64(0x9a762db734f04059), 493 uint64(0xfd4f21d26c4e3ee7), uint64(0xef5957dc398dfdb8), 494 uint64(0xdaeb492b490c9b8d), uint64(0x0d70f36849d7a25b), 495 uint64(0x84558d7ad0ae3b7d), uint64(0x658ef8e4f0e9a5f5), 496 uint64(0x533b1036f4a2b8a0), uint64(0x5aec3e759e07a80c), 497 uint64(0x4f88e85692946891), uint64(0x4cbcbaf8555cb05b), 498 uint64(0x7b9487f3993bbbe3), uint64(0x5d1c6b72d6f4da75), 499 uint64(0x6db334dc28acae64), uint64(0x71db28b850a5346c), 500 uint64(0x2a518d10f2e261f8), uint64(0xfc75dd593364dbe3), 501 uint64(0xa23fce43f1bcac1c), uint64(0xb043e8023cd1bb67), 502 uint64(0x75a12988ca5b0a33), uint64(0x5c5316b44d19347f), 503 uint64(0x1e4d790ec3943b92), uint64(0x3fafeeb6d7757479), 504 uint64(0x21391abef7d4a8ea), uint64(0x5127234c097ef45c), 505 uint64(0xd23c32ba5324a326), uint64(0xadd5a66d4a17a344), 506 uint64(0x08c9f2afa63e1db5), uint64(0x563c6b91983d5983), 507 uint64(0x4d608672a17cf84c), uint64(0xf6c76e08cc3ee246), 508 uint64(0x5e76bcb1b333982f), uint64(0x2ae6c4efa566d62b), 509 uint64(0x36d4c1bee8b6f406), uint64(0x6321efbc1582ee74), 510 uint64(0x69c953f40d4ec1fd), uint64(0x26585806c45a7da7), 511 uint64(0x16fae0061614c17e), uint64(0x3f9d63283daf907e), 512 uint64(0x0cd29b00e3f2c9d2), uint64(0x300cd4b730ceaa5f), 513 uint64(0x9832e0f216512a74), uint64(0x9af8cee3d830eb0d), 514 uint64(0x9279f1b57b9ec54b), uint64(0xd36886046ee651ff), 515 uint64(0x316796e6574d239b), uint64(0x05750a17f3a6e6cc), 516 uint64(0xce6c3213d98176b1), uint64(0x62a205f88452173c), 517 uint64(0x47154778b3cb2bf4), uint64(0x486a9323825446ff), 518 uint64(0x65655e4e0758df38), uint64(0x8e5086fc897cfcf2), 519 uint64(0x86ca0bd0442e7031), uint64(0x4e477830a20940f0), 520 uint64(0x8338f7d139eea065), uint64(0xbd3a2ce437e95ef7), 521 uint64(0x6ff8130126b29721), uint64(0xe7de9fefd1ed44a3), 522 uint64(0xd992257615dfa08b), uint64(0xbe42dc12f6f7853c), 523 uint64(0x7eb027ab7ceca7d8), uint64(0xdea83eaada7d8d53), 524 uint64(0xd86902bd93ce25aa), uint64(0xf908731afd43f65a), 525 uint64(0xa5194a17daef5fc0), uint64(0x6a21fd4c33664d97), 526 uint64(0x701541db3198b435), uint64(0x9b54cdedbb0f1eea), 527 uint64(0x72409751a163d09a), uint64(0xe26f4791bf9d75f6), 528 } 529 530 var kWrapValue = []uint64{ 531 uint64(0x5555555555555555), 532 uint64(0x3333333333333333), 533 uint64(0x0F0F0F0F0F0F0F0F), 534 uint64(0x00FF00FF00FF00FF), 535 uint64(0x0000FFFF0000FFFF), 536 uint64(0x00000000FFFFFFFF), 537 } 538 539 var kWrapOffset = []uint64{ 540 1, 2, 4, 8, 16, 32, 541 }