ghash.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
  2. //
  3. // This Source Code Form is subject to the terms of the MIT License.
  4. // If a copy of the MIT was not distributed with this file,
  5. // You can obtain one at https://github.com/gogf/gf.
  6. // Package ghash provides some classic hash functions(uint32/uint64) in go.
  7. package ghash
  8. // BKDR Hash Function
  9. func BKDRHash(str []byte) uint32 {
  10. var seed uint32 = 131 // 31 131 1313 13131 131313 etc..
  11. var hash uint32 = 0
  12. for i := 0; i < len(str); i++ {
  13. hash = hash*seed + uint32(str[i])
  14. }
  15. return hash
  16. }
  17. // BKDR Hash Function 64
  18. func BKDRHash64(str []byte) uint64 {
  19. var seed uint64 = 131 // 31 131 1313 13131 131313 etc..
  20. var hash uint64 = 0
  21. for i := 0; i < len(str); i++ {
  22. hash = hash*seed + uint64(str[i])
  23. }
  24. return hash
  25. }
  26. // SDBM Hash
  27. func SDBMHash(str []byte) uint32 {
  28. var hash uint32 = 0
  29. for i := 0; i < len(str); i++ {
  30. // equivalent to: hash = 65599*hash + uint32(str[i]);
  31. hash = uint32(str[i]) + (hash << 6) + (hash << 16) - hash
  32. }
  33. return hash
  34. }
  35. // SDBM Hash 64
  36. func SDBMHash64(str []byte) uint64 {
  37. var hash uint64 = 0
  38. for i := 0; i < len(str); i++ {
  39. // equivalent to: hash = 65599*hash + uint32(str[i])
  40. hash = uint64(str[i]) + (hash << 6) + (hash << 16) - hash
  41. }
  42. return hash
  43. }
  44. // RS Hash Function
  45. func RSHash(str []byte) uint32 {
  46. var b uint32 = 378551
  47. var a uint32 = 63689
  48. var hash uint32 = 0
  49. for i := 0; i < len(str); i++ {
  50. hash = hash*a + uint32(str[i])
  51. a *= b
  52. }
  53. return hash
  54. }
  55. // RS Hash Function 64
  56. func RSHash64(str []byte) uint64 {
  57. var b uint64 = 378551
  58. var a uint64 = 63689
  59. var hash uint64 = 0
  60. for i := 0; i < len(str); i++ {
  61. hash = hash*a + uint64(str[i])
  62. a *= b
  63. }
  64. return hash
  65. }
  66. // JS Hash Function
  67. func JSHash(str []byte) uint32 {
  68. var hash uint32 = 1315423911
  69. for i := 0; i < len(str); i++ {
  70. hash ^= (hash << 5) + uint32(str[i]) + (hash >> 2)
  71. }
  72. return hash
  73. }
  74. // JS Hash Function 64
  75. func JSHash64(str []byte) uint64 {
  76. var hash uint64 = 1315423911
  77. for i := 0; i < len(str); i++ {
  78. hash ^= (hash << 5) + uint64(str[i]) + (hash >> 2)
  79. }
  80. return hash
  81. }
  82. // P. J. Weinberger Hash Function
  83. func PJWHash(str []byte) uint32 {
  84. var BitsInUnignedInt uint32 = 4 * 8
  85. var ThreeQuarters uint32 = (BitsInUnignedInt * 3) / 4
  86. var OneEighth uint32 = BitsInUnignedInt / 8
  87. var HighBits uint32 = (0xFFFFFFFF) << (BitsInUnignedInt - OneEighth)
  88. var hash uint32 = 0
  89. var test uint32 = 0
  90. for i := 0; i < len(str); i++ {
  91. hash = (hash << OneEighth) + uint32(str[i])
  92. if test = hash & HighBits; test != 0 {
  93. hash = (hash ^ (test >> ThreeQuarters)) & (^HighBits + 1)
  94. }
  95. }
  96. return hash
  97. }
  98. // P. J. Weinberger Hash Function 64
  99. func PJWHash64(str []byte) uint64 {
  100. var BitsInUnignedInt uint64 = 4 * 8
  101. var ThreeQuarters uint64 = (BitsInUnignedInt * 3) / 4
  102. var OneEighth uint64 = BitsInUnignedInt / 8
  103. var HighBits uint64 = (0xFFFFFFFFFFFFFFFF) << (BitsInUnignedInt - OneEighth)
  104. var hash uint64 = 0
  105. var test uint64 = 0
  106. for i := 0; i < len(str); i++ {
  107. hash = (hash << OneEighth) + uint64(str[i])
  108. if test = hash & HighBits; test != 0 {
  109. hash = (hash ^ (test >> ThreeQuarters)) & (^HighBits + 1)
  110. }
  111. }
  112. return hash
  113. }
  114. // ELF Hash Function
  115. func ELFHash(str []byte) uint32 {
  116. var hash uint32 = 0
  117. var x uint32 = 0
  118. for i := 0; i < len(str); i++ {
  119. hash = (hash << 4) + uint32(str[i])
  120. if x = hash & 0xF0000000; x != 0 {
  121. hash ^= x >> 24
  122. hash &= ^x + 1
  123. }
  124. }
  125. return hash
  126. }
  127. // ELF Hash Function 64
  128. func ELFHash64(str []byte) uint64 {
  129. var hash uint64 = 0
  130. var x uint64 = 0
  131. for i := 0; i < len(str); i++ {
  132. hash = (hash << 4) + uint64(str[i])
  133. if x = hash & 0xF000000000000000; x != 0 {
  134. hash ^= x >> 24
  135. hash &= ^x + 1
  136. }
  137. }
  138. return hash
  139. }
  140. // DJB Hash Function
  141. func DJBHash(str []byte) uint32 {
  142. var hash uint32 = 5381
  143. for i := 0; i < len(str); i++ {
  144. hash += (hash << 5) + uint32(str[i])
  145. }
  146. return hash
  147. }
  148. // DJB Hash Function 64.
  149. func DJBHash64(str []byte) uint64 {
  150. var hash uint64 = 5381
  151. for i := 0; i < len(str); i++ {
  152. hash += (hash << 5) + uint64(str[i])
  153. }
  154. return hash
  155. }
  156. // AP Hash Function
  157. func APHash(str []byte) uint32 {
  158. var hash uint32 = 0
  159. for i := 0; i < len(str); i++ {
  160. if (i & 1) == 0 {
  161. hash ^= (hash << 7) ^ uint32(str[i]) ^ (hash >> 3)
  162. } else {
  163. hash ^= ^((hash << 11) ^ uint32(str[i]) ^ (hash >> 5)) + 1
  164. }
  165. }
  166. return hash
  167. }
  168. // AP Hash Function 64
  169. func APHash64(str []byte) uint64 {
  170. var hash uint64 = 0
  171. for i := 0; i < len(str); i++ {
  172. if (i & 1) == 0 {
  173. hash ^= (hash << 7) ^ uint64(str[i]) ^ (hash >> 3)
  174. } else {
  175. hash ^= ^((hash << 11) ^ uint64(str[i]) ^ (hash >> 5)) + 1
  176. }
  177. }
  178. return hash
  179. }