Advertisement
Guest User

Untitled

a guest
Jan 17th, 2020
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. const
  2. p0 = 0xa0761d6478bd642f'u64
  3. p1 = 0xe7037ed1a0b428db'u64
  4. p2 = 0x8ebc6af09c88c6e3'u64
  5. p3 = 0x589965cc75374cc3'u64
  6. p4 = 0x1d8e4e27c47d124f'u64
  7.  
  8. proc wymum(a, b: uint64): uint64 {.inline.} =
  9. let
  10. ha: uint64 = a shr 32
  11. hb: uint64 = b shr 32
  12. la: uint64 = cast[uint32](a)
  13. lb: uint64 = cast[uint32](b)
  14. rh: uint64 = ha * hb
  15. rm0: uint64 = ha * lb
  16. rm1: uint64 = hb * la
  17. rl: uint64 = la * lb
  18. t: uint64 = rl + (rm0 shl 32)
  19.  
  20. var c: uint64 = uint64(t < rl)
  21.  
  22. let lo: uint64 = t + (rm1 shl 32)
  23.  
  24. c += uint64(lo < t)
  25.  
  26. let hi: uint64 = rh + (rm0 shr 32) + (rm1 shr 32) + c
  27.  
  28. hi xor lo
  29.  
  30. proc wyr8(p: pointer): uint64 {.inline.} =
  31. copyMem(addr(result), p, 8)
  32.  
  33. proc wyr4(p: pointer): uint64 {.inline.} =
  34. copyMem(addr(result), p, 4)
  35.  
  36. proc wyr3(p: ptr UncheckedArray[uint8], k: uint64): uint64 {.inline.} =
  37. (cast[uint64](p[0]) shl 16) or (cast[uint64](p[k shr 1]) shl 8) or cast[uint64](p[k - 1])
  38.  
  39. proc wyhash*(key: pointer, len, seed: uint64): uint64 {.inline.} =
  40. if len == 0'u64:
  41. return 0
  42.  
  43. var p = cast[ptr UncheckedArray[uint8]](key)
  44.  
  45. if len < 4:
  46. return wymum(wymum(wyr3(p, len) xor seed xor p0, seed xor p1), len xor p4)
  47.  
  48. elif len <= 8:
  49. return wymum(wymum(wyr4(p) xor seed xor p0, wyr4(addr p[len - 4]) xor seed xor p1), len xor p4)
  50.  
  51. elif len <= 16:
  52. return wymum(wymum(wyr8(p) xor seed xor p0, wyr8(addr p[len - 8]) xor seed xor p1), len xor p4)
  53.  
  54. elif len <= 24:
  55. return wymum(wymum(wyr8(p) xor seed xor p0, wyr8(addr p[8]) xor seed xor p1) xor wymum(wyr8(addr p[len - 8]) xor seed xor p2, seed xor p3), len xor p4)
  56.  
  57. elif len <= 32:
  58. return wymum(wymum(wyr8(p) xor seed xor p0, wyr8(addr p[8]) xor seed xor p1) xor wymum(wyr8(addr p[16]) xor seed xor p2, wyr8(addr p[len - 8]) xor seed xor p3), len xor p4)
  59.  
  60. var
  61. seed = seed
  62. see1 = seed
  63. i = len
  64.  
  65. if i >= 256:
  66. while i >= 256:
  67. seed = wymum(wyr8(p) xor seed xor p0, wyr8(addr p[8]) xor seed xor p1) xor wymum(wyr8(addr p[16]) xor seed xor p2, wyr8(addr p[24]) xor seed xor p3)
  68.  
  69. see1 = wymum(wyr8(addr p[32]) xor see1 xor p1, wyr8(addr p[40]) xor see1 xor p2) xor wymum(wyr8(addr p[48]) xor see1 xor p3, wyr8(addr p[56]) xor see1 xor p0)
  70.  
  71. seed = wymum(wyr8(addr p[64]) xor seed xor p0, wyr8(addr p[72]) xor seed xor p1) xor wymum(wyr8(addr p[80]) xor seed xor p2, wyr8(addr p[88]) xor seed xor p3)
  72.  
  73. see1 = wymum(wyr8(addr p[96]) xor see1 xor p1, wyr8(addr p[104]) xor see1 xor p2) xor wymum(wyr8(addr p[112]) xor see1 xor p3, wyr8(addr p[120]) xor see1 xor p0)
  74.  
  75. seed = wymum(wyr8(addr p[128]) xor seed xor p0, wyr8(addr p[136]) xor seed xor p1) xor wymum(wyr8(addr p[144]) xor seed xor p2, wyr8(addr p[152]) xor seed xor p3)
  76.  
  77. see1 = wymum(wyr8(addr p[160]) xor see1 xor p1, wyr8(addr p[168]) xor see1 xor p2) xor wymum(wyr8(addr p[176]) xor see1 xor p3, wyr8(addr p[184]) xor see1 xor p0)
  78.  
  79. seed = wymum(wyr8(addr p[192]) xor seed xor p0, wyr8(addr p[200]) xor seed xor p1) xor wymum(wyr8(addr p[208]) xor seed xor p2, wyr8(addr p[216]) xor seed xor p3)
  80.  
  81. see1 = wymum(wyr8(addr p[224]) xor see1 xor p1, wyr8(addr p[232]) xor see1 xor p2) xor wymum(wyr8(addr p[240]) xor see1 xor p3, wyr8(addr p[248]) xor see1 xor p0)
  82.  
  83. dec(i, 256)
  84.  
  85. p = cast[ptr UncheckedArray[uint8]](addr p[256])
  86.  
  87. while i >= 32:
  88. seed = wymum(wyr8(p) xor seed xor p0, wyr8(addr p[8]) xor seed xor p1)
  89.  
  90. see1 = wymum(wyr8(addr p[16]) xor see1 xor p2, wyr8(addr p[24]) xor see1 xor p3)
  91.  
  92. dec(i, 32)
  93.  
  94. p = cast[ptr UncheckedArray[uint8]](addr p[32])
  95.  
  96. if i == 0:
  97. discard
  98.  
  99. elif i < 4:
  100. seed = wymum(wyr3(p, i) xor seed xor p0, seed xor p1)
  101.  
  102. elif i <= 8:
  103. seed = wymum(wyr4(p) xor seed xor p0, wyr4(addr p[i - 4]) xor seed xor p1)
  104.  
  105. elif i <= 16:
  106. seed = wymum(wyr8(p) xor seed xor p0, wyr8(addr p[i - 8]) xor seed xor p1)
  107.  
  108. elif i <= 24:
  109. seed = wymum(wyr8(p) xor seed xor p0, wyr8(addr p[8]) xor seed xor p1)
  110.  
  111. see1 = wymum(wyr8(addr p[i - 8]) xor see1 xor p2, see1 xor p3)
  112.  
  113. else:
  114. seed = wymum(wyr8(p) xor seed xor p0, wyr8(addr p[8]) xor seed xor p1)
  115.  
  116. see1 = wymum(wyr8(addr p[16]) xor see1 xor p2, wyr8(addr p[i - 8]) xor see1 xor p3)
  117.  
  118. wymum(seed xor see1, len xor p4)
  119.  
  120. proc wyrand*(state: var uint64): uint64 {.inline.} =
  121. state += p0
  122.  
  123. wymum(state xor p1, state)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement