go implementation of CodeDweller/mishmash.hpp/cpp
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mishmash.go 4.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package mishmash
  2. var PrimeSet = [256]uint32{
  3. 3825240899, 3652005211, 2966014067, 3432177659, 3109134187, 3139884271, 3108258589, 2277840529,
  4. 3748140223, 4206444373, 2684505017, 3883989821, 4076539213, 3880335997, 2603229667, 2358458953,
  5. 4061135443, 3826856503, 2671898833, 3266747401, 3403611587, 2483486933, 3889003891, 2820911959,
  6. 2318077829, 3470930861, 3231587809, 3225029887, 4123396483, 3422817119, 3612514831, 2170177423,
  7. 3058754837, 3000926393, 2825656217, 3387930461, 3532314017, 3245479361, 3466327211, 4080294503,
  8. 4252034179, 2302986211, 3394476707, 3697851029, 3957195257, 2862308587, 4285266071, 3681357247,
  9. 3157577413, 3839398561, 3097979117, 3590787463, 3354450497, 3110291879, 3938796493, 3196834463,
  10. 2374254481, 2702597567, 3046228397, 3461690719, 2641445467, 2401060583, 2483505539, 2775297373,
  11. 2262447391, 3118976533, 3014355683, 3355176449, 4055753381, 2277045713, 3098402119, 3894957487,
  12. 2770620887, 4125228329, 2575044467, 4162428989, 3294651817, 2308925797, 3698223103, 2150023273,
  13. 3075614681, 2410764047, 3624889381, 3264455489, 3241969651, 3001767217, 3407799859, 2998917373,
  14. 2629826653, 2714272271, 3987786247, 2880807353, 3608804803, 2231694917, 3790372403, 4156893413,
  15. 2563320007, 2423350621, 2735169119, 4021079791, 4150641413, 2907916357, 3772971647, 2481168307,
  16. 2842943119, 2234753693, 3966637117, 2732029457, 3207475039, 3533605151, 2349367747, 3336108011,
  17. 2431060103, 2263416899, 2350941683, 3869512277, 3880987697, 3062735029, 2512894603, 3669845519,
  18. 2235487739, 3201016501, 2438124943, 4170458909, 2938134889, 4231610087, 3187120061, 2378420137,
  19. 3365835877, 3078766697, 3704906059, 3541986781, 3969072823, 3510542281, 2306290751, 3898737419,
  20. 2898069347, 4092904481, 2484285403, 2721169823, 4293617527, 2928584759, 2213966141, 2335957513,
  21. 3367371923, 2965261109, 4175805451, 3541995157, 2964065479, 3997902791, 3053542259, 2168926237,
  22. 3253268639, 2620083509, 3314283407, 3873087809, 2636771209, 2737638653, 3209154931, 3414204793,
  23. 3451689091, 2638985941, 2899591693, 2654878441, 2748067627, 3395485733, 2679070523, 3100687721,
  24. 2520033701, 2980087373, 2873947007, 2565436501, 2400053783, 4163039563, 3517993571, 4263192407,
  25. 3385597069, 2768101117, 3502890653, 3092130347, 3748553827, 4109944849, 2418961109, 3398621741,
  26. 3073383031, 2167592489, 2950739053, 3529429811, 3167420899, 4254703357, 3344014309, 3725480141,
  27. 3745944539, 3456003191, 2832137237, 4202217191, 3730577581, 2837794231, 2155546451, 2539211039,
  28. 2256984649, 2458975411, 2986340839, 3412432363, 3596817463, 2973444983, 2409734297, 3273292601,
  29. 3302556869, 3630727567, 3670056499, 3300959521, 3949319809, 3047032057, 3412226563, 2147483647,
  30. 2914045411, 2882644273, 4065606553, 2735903059, 3195020617, 3887229457, 3232900987, 3409357867,
  31. 3037985513, 3162012463, 3340137193, 2186608547, 4018093523, 4153387103, 2566863161, 3087918809,
  32. 3332247019, 3579407009, 3082973791, 4178339461, 3269728331, 2270495261, 2400046513, 2641204147,
  33. 2593078337, 2398468271, 3861488311, 3766456459, 2970457213, 3491800771, 3797865553, 2756555203,
  34. 3154883449, 3782386073, 3324965471, 4088422453, 3784508591, 3903657481, 3010059277, 2936392909,
  35. }
  36. func selectPrime(n uint64) uint64 {
  37. return uint64(PrimeSet[n&0xff])
  38. }
  39. func Engine(buffer string, length int, accumulator uint64) uint64 {
  40. for i := 0; i < length; i++ {
  41. b := uint64(buffer[i])
  42. var accumulator1 uint64 = selectPrime(accumulator) + b
  43. var accumulator2 uint64 = ^accumulator * selectPrime(b)
  44. var accumulator3 = accumulator >> (32 + ((b & 0x1F) ^ (b >> 5)))
  45. accumulator = accumulator1 + accumulator2 + accumulator3
  46. }
  47. return accumulator
  48. }
  49. func Mishmash(buffer string, nums ...uint64) uint32 {
  50. // nums is a seed/accumulator
  51. var accumulator uint64
  52. if 0 == len(nums) {
  53. // seeding with 0 by default - could be changed
  54. accumulator = Engine(buffer, len(buffer), 0)
  55. } else {
  56. accumulator = Engine(buffer, len(buffer), nums[0])
  57. }
  58. return uint32(accumulator & 0x00000000ffffffff)
  59. }
  60. // example below shows calling Mishmash on "hello world"
  61. // and then collecting the hash. Given
  62. // a collision we simply call Mishmash again, giving it
  63. // the first hash as a seed this time and get a second hash.
  64. /*
  65. func main() {
  66. buf := []byte("Hello world")
  67. // grab the accumulator if necessary
  68. accum := Engine(buf, len(buf), 0)
  69. // grab the hash - decode accumulator into hash
  70. hash := MishmashAccumulator(accum)
  71. fmt.Printf("%08x\n", hash)
  72. // now get second hash - seed with accumulator
  73. secondHash := Mishmash(buf, accum)
  74. fmt.Printf("%08x\n", secondHash)
  75. // you can also get a simple hash
  76. simpleMishmash := Mishmash(buf)
  77. fmt.Printf("%08x\n", simpleMishmash)
  78. }
  79. */
  80. // example below used to validate output against C++ mishmash
  81. /*
  82. func main() {
  83. buf := "Hello world!"
  84. first := MishmashAccumulator(Engine(buf, len(buf), 0))
  85. second := MishmashAccumulator(Engine(buf, len(buf), 1))
  86. var combo uint64
  87. combo = uint64(first)<<32 | uint64(second)
  88. fmt.Println(first, second, combo)
  89. }
  90. */