(精華)2020年6月27日 C#類庫 布隆過濾器幫助類

      網友投稿 685 2025-04-01

      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

      (精華)2020年6月27日 C#類庫 布隆過濾器幫助類

      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

      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小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:ico在線制作(ico圖標在線制作)
      下一篇:WPS office文檔中如何插入腳注?
      相關文章
      亚洲天堂电影在线观看| 午夜亚洲www湿好大| 一本天堂ⅴ无码亚洲道久久| 亚洲成在人天堂在线| 久久久久久a亚洲欧洲aⅴ| 国产91精品一区二区麻豆亚洲| 亚洲精品无播放器在线播放| 国产成人精品日本亚洲18图| 亚洲国产电影在线观看| 亚洲精品无码久久毛片波多野吉衣 | 91亚洲一区二区在线观看不卡| 国产亚洲高清不卡在线观看| 亚洲人JIZZ日本人| 亚洲色婷婷六月亚洲婷婷6月| 中文字幕中韩乱码亚洲大片| 亚洲精品美女久久7777777| 亚洲熟伦熟女专区hd高清| 亚洲精品无码久久久久A片苍井空 亚洲精品无码久久久久YW | 亚洲一区免费观看| 国产L精品国产亚洲区久久| 亚洲伊人久久综合影院| 亚洲精品国产字幕久久不卡| 亚洲欧洲成人精品香蕉网| 亚洲乱亚洲乱妇无码麻豆| 国产精一品亚洲二区在线播放| 中文字幕亚洲无线码a| 亚洲欧洲日产国码无码久久99| 久久久久亚洲精品男人的天堂| 黑人大战亚洲人精品一区| 人人狠狠综合久久亚洲88| 久久久久久亚洲av成人无码国产| 久久伊人久久亚洲综合| 色婷婷六月亚洲婷婷丁香| 亚洲一卡二卡三卡四卡无卡麻豆| 精品亚洲成A人无码成A在线观看| 伊人久久五月丁香综合中文亚洲 | 亚洲欧美日韩久久精品| 99亚洲精品卡2卡三卡4卡2卡| 亚洲av无码一区二区三区天堂古代 | 亚洲人成欧美中文字幕| 麻豆亚洲AV成人无码久久精品|