(精华)2020年6月27日 C#类库 布隆过滤器帮助类

网友投稿 594 2022-05-30

using System; using System.Collections; using System.Collections.Generic; namespace Core.Util { ///

/// 一个布隆过滤器 /// /// 泛型数据类型 public class BloomFilter { Random _random; int _bitSize, _numberOfHashes, _setSize; BitArray _bitArray; #region Constructors /// /// 初始化bloom滤波器并设置hash散列的最佳数目 /// /// 布隆过滤器的大小(m)默认为10E消耗100M内存 /// 集合的大小 (n)默认为1000W public BloomFilter(int bitSize=1000000000, int setSize=10000000) { _bitSize = bitSize; _bitArray = new BitArray(bitSize); _setSize = setSize; _numberOfHashes = OptimalNumberOfHashes(_bitSize, _setSize); } //hash散列函数的数量(k) public BloomFilter(int bitSize, int setSize, int numberOfHashes) { _bitSize = bitSize; _bitArray = new BitArray(bitSize); _setSize = setSize; _numberOfHashes = numberOfHashes; } #endregion #region 属性 public int NumberOfHashes { set { _numberOfHashes = value; } get { return _numberOfHashes; } } public int SetSize { set { _setSize = value; } get { return _setSize; } } public int BitSize { set { _bitSize = value; } get { return _bitSize; } } #endregion #region 公共方法 public void Add(T item) { _random = new Random(Hash(item)); for (int i = 0; i < _numberOfHashes; i++) _bitArray[_random.Next(_bitSize)] = true; } public bool Contains(T item) { _random = new Random(Hash(item)); for (int i = 0; i < _numberOfHashes; i++) { if (!_bitArray[_random.Next(_bitSize)]) return false; } return true; } //检查列表中的任何项是否可能是在集合。 //如果布隆过滤器包含列表中的任何一项,返回真 public bool ContainsAny(List items) { foreach (T item in items) { if (Contains(item)) return true; } return false; } //检查列表中的所有项目是否都在集合。 public bool ContainsAll(List items) { foreach (T item in items) { if (!Contains(item)) return false; } return true; } /// /// 计算遇到误检率的概率。 /// /// Probability of a false positive public double FalsePositiveProbability() { return Math.Pow((1 - Math.Exp(-_numberOfHashes * _setSize / (double)_bitSize)), _numberOfHashes); } #endregion #region 私有方法 private int Hash(T item) { return item.GetHashCode(); } //计算基于布隆过滤器散列的最佳数量 private int OptimalNumberOfHashes(int bitSize, int setSize) { return (int)Math.Ceiling((bitSize / setSize) * Math.Log(2.0)); } #endregion } /// /// 共享内存布隆过滤器 /// /// 泛型数据类型 public class BloomFilterWithShareMemory { Random _random; int _bitSize, _numberOfHashes, _setSize; ShareMenmory sm; #region Constructors /// /// 初始化bloom滤波器并设置hash散列的最佳数目 /// /// /// 布隆过滤器的大小(m)默认为10E消耗100M内存 /// 集合的大小 (n)默认为1000W public BloomFilterWithShareMemory(string bloomName,int bitSize = 1000000000, int setSize = 10000000) { sm = new ShareMenmory(bloomName, 1000000000); _bitSize = bitSize; _setSize = setSize; _numberOfHashes = OptimalNumberOfHashes(_bitSize, _setSize); } #endregion #region 属性 public int NumberOfHashes { set { _numberOfHashes = value; } get { return _numberOfHashes; } } public int SetSize { set { _setSize = value; } get { return _setSize; } } public int BitSize { set { _bitSize = value; } get { return _bitSize; } } #endregion #region 公共方法 public void Add(T item) { _random = new Random(Hash(item)); for (int i = 0; i < _numberOfHashes; i++) { int index = _random.Next(_bitSize); int j=0; int offSet=0; if((index+1) % 8==0) { j = (index + 1) / 8 - 1; } else { j = (index + 1) / 8; offSet = (index + 1) % 8 - 1; } byte[] getData = sm.Read(1, j); BitArray bitArry = new BitArray(getData); bitArry[offSet] = true; int tmp = 0; for (int k = 0; k < 8; k++) { if (bitArry[k] == true) tmp += (int)Math.Pow(2, k); } byte[] setData = new byte[1]; setData[0] = (byte)tmp; sm.Write(setData,j); } } public bool Contains(T item) { _random = new Random(Hash(item)); for (int i = 0; i < _numberOfHashes; i++) { int index = _random.Next(_bitSize); int j = 0; int offSet = 0; if ((index + 1) % 8 == 0) { j = (index + 1) / 8 - 1; } else { j = (index + 1) / 8; offSet = (index + 1) % 8 - 1; } byte[] getData = sm.Read(1, j); BitArray bitArry = new BitArray(getData); if (bitArry[offSet] == false) return false; } return true; } public void close() { sm.Close(); } //检查列表中的任何项是否可能是在集合。 //如果布隆过滤器包含列表中的任何一项,返回真 public bool ContainsAny(List items) { foreach (T item in items) { if (Contains(item)) return true; } return false; } //检查列表中的所有项目是否都在集合。 public bool ContainsAll(List items) { foreach (T item in items) { if (!Contains(item)) return false; } return true; } /// /// 计算遇到误检率的概率。 /// /// Probability of a false positive public double FalsePositiveProbability() { return Math.Pow((1 - Math.Exp(-_numberOfHashes * _setSize / (double)_bitSize)), _numberOfHashes); } #endregion #region 私有方法 private int Hash(T item) { return item.GetHashCode(); } //计算基于布隆过滤器散列的最佳数量 private int OptimalNumberOfHashes(int bitSize, int setSize) { return (int)Math.Ceiling((bitSize / setSize) * Math.Log(2.0)); } #endregion } }

1

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

(精华)2020年6月27日 C#类库 布隆过滤器帮助类

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

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

C#

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:UML 六种关系--02
下一篇:PV(访问量)、UV(独立访客)、IP(独立IP) (转)
相关文章