

之前由于项目中用到了大规模的数据处理,使用了哈希函数作为应用,在此做了些工作将一些哈希( hash )函数的性能和冲突概率进行了测试、总结,并给出了推荐的几种较好的字符串哈希函数。
哈希的目的即将原有的长字符串压缩为32位、64位、128位的哈希编码存储,以节省存储空间。而在这个过程中,起重要作用的便是哈希函数。
在本实验中,采用了常见的一些哈希函数作为对比,并采用了10 million以上(千万级)的较大数据规模进行了测试。
表中的除了最后行表示为时间,其他均为该列哈希函数的冲突概率。
SET 1 :包含大小写字母、数字的,长度为3-12均匀分布,15 million 个样本。
SET 2 :仅包含小写字母的,长度为3-12均匀分布, 15 million 个样本
SET 3 :包含ASCII(32-127)中的常见的字符,长度10-30均匀分布,11 million 个样本。
最后在Release模式下,进行了时间性能测试,即为上表中的最后一行,记录为平均每次哈希(Hash)消耗时间。性能测试,横向来看,差距都并不大,对于哈希函数的选择上,还是应首选冲突小的较好。
测试系统配置:
CPU: AMD 945 X4 MEMORY: 4G SYSTEM: WINDOWS VISTA ULTIMATE (32 bit)
推荐:表中标红的为效果较好的算法,具统计和评论来说BKDR、SDBM、FNV_1 对大规模的字符串哈希来说,有较好的性能表现,推荐使用。同时,如果数据集在 million级以上的话,建议使用64位哈希函数,这样可以有效的避免冲突概率过高的情况。(10Million 上 64位哈希冲突率能到10e-6以下,经过测试)
在下面有全部代码,注释部分为算法的简单摘要,有兴趣的朋友可以去仔细参详下。第一次写BLOG,写的不好请大家指出不足之处。
Code1

2


3

4

5



6

7

8

9

10

11



12

13

14

15

16

17

18

19

20


21

22

23

24

25



26

27

28

29

30

31

32

33

34



35

36

37



38

39

40

41

42

43

44

45

46

47


48

49

50



51

52

53

54



55

56

57

58

59

60

61

62



63

64

65

66

67



68

69

70

71

72

73

74

75


76

77

78

79



80

81

82

83



84

85

86

87

88

89

90

91


92

93

94

95



96

97

98

99



100

101

102

103

104

105

106

107


108

109

110

111



112

113

114

115



116

117

118

119

120

121

122

123



124

125

126



127

128

129

130

131

132

133

134


135

136

137

138

139

140



141

142

143

144



145

146

147

148

149

150

151

152

153


154

155

156



157

158

159



160

161



162

163

164

165



166

167

168

169

170

171
