This repository was archived by the owner on Dec 24, 2022. It is now read-only.
File tree Expand file tree Collapse file tree 1 file changed +65
-0
lines changed Expand file tree Collapse file tree 1 file changed +65
-0
lines changed Original file line number Diff line number Diff line change
1
+ using System ;
2
+
3
+ namespace ServiceStack . Text
4
+ {
5
+ // https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed#answer-145633
6
+ // https://github.com/jitbit/MurmurHash.net
7
+ public class MurmurHash2
8
+ {
9
+ public static uint Hash ( string data )
10
+ {
11
+ return Hash ( System . Text . Encoding . UTF8 . GetBytes ( data ) ) ;
12
+ }
13
+
14
+ public static uint Hash ( byte [ ] data )
15
+ {
16
+ return Hash ( data , 0xc58f1a7a ) ;
17
+ }
18
+ const uint m = 0x5bd1e995 ;
19
+ const int r = 24 ;
20
+
21
+ public static uint Hash ( byte [ ] data , uint seed )
22
+ {
23
+ int length = data . Length ;
24
+ if ( length == 0 )
25
+ return 0 ;
26
+ uint h = seed ^ ( uint ) length ;
27
+ int currentIndex = 0 ;
28
+ while ( length >= 4 )
29
+ {
30
+ uint k = ( uint ) ( data [ currentIndex ++ ] | data [ currentIndex ++ ] << 8 | data [ currentIndex ++ ] << 16 | data [ currentIndex ++ ] << 24 ) ;
31
+ k *= m ;
32
+ k ^= k >> r ;
33
+ k *= m ;
34
+
35
+ h *= m ;
36
+ h ^= k ;
37
+ length -= 4 ;
38
+ }
39
+ switch ( length )
40
+ {
41
+ case 3 :
42
+ h ^= ( UInt16 ) ( data [ currentIndex ++ ] | data [ currentIndex ++ ] << 8 ) ;
43
+ h ^= ( uint ) ( data [ currentIndex ] << 16 ) ;
44
+ h *= m ;
45
+ break ;
46
+ case 2 :
47
+ h ^= ( UInt16 ) ( data [ currentIndex ++ ] | data [ currentIndex ] << 8 ) ;
48
+ h *= m ;
49
+ break ;
50
+ case 1 :
51
+ h ^= data [ currentIndex ] ;
52
+ h *= m ;
53
+ break ;
54
+ default :
55
+ break ;
56
+ }
57
+
58
+ h ^= h >> 13 ;
59
+ h *= m ;
60
+ h ^= h >> 15 ;
61
+
62
+ return h ;
63
+ }
64
+ }
65
+ }
You can’t perform that action at this time.
0 commit comments