(1)布隆過濾器 bloomfilter
演算法:1. 初始化乙個長度為n位元的陣列,每個位元位初始化為0
2. 首先需要k個hash函式,每個函式都把key雜湊成為m個整數
3. 某個key加入集合時,用k個hash函式計算出k個雜湊值,並把陣列中對應的位元位置為1
4. 判斷某個key是否在集合時,用k個hash函式計算出k個雜湊值,並查詢陣列中對應的位元位,如果所有的位元位都是1,認為在集合中
通過兩個圖簡單的理解下:
紅色線條表示hash1方法 黑色線條表示hash2方法
x和y 在hash1和hash2方法中獲得了完全相同的值,則在忽略誤判率的情況下 認為x和y是相同值
x和z在hash1的方法時便不能完全重合 可以直接認為x和z是兩個不同值
hash2方法中重合,是因為hash碰撞,所以理論上為了避免誤判 降低誤判率 hash方法越多越好,陣列越長越好
缺點:1)因為存在hash碰撞 所以一定會誤判存在(臉黑點兩個值也能判斷錯了) 但是如果判讀為不存在 就必定不存在
2)普通過濾不支援刪除操作(couting bloomfilter 帶計數器的布隆過濾器可以刪除)
簡單的使用:
public static void main(string args)
當判斷1000w的資料,能容忍的誤判率萬分之一時,布隆過濾器會構造 13個hash方法,3000w長度的陣列
計算後將佔3.57mb 記憶體
(2)計算一致性hash consistenthash()
話不多說 直接上**
public static void main(string args)
public static int consistenthash(long input, int buckets) else }}
// lcg偽隨機數的演算法實現,關於lcg的解釋可以參考
private static final class linearcongruentialgenerator
public double nextdouble()
}
原始碼註解是從別的部落格裡抄的( 理解也不算太難
這裡有乙個問題 隨意造了乙個值 只是修改了buckets 返回了兩個不同的值,所以我重新寫了乙個呼叫方法
public static void main(string args)
system.out.println();}}
結果如下
可以看出 隨著機器數量的變化 bucket也一直在做著微調
但是想到一致性hash目的:
在伺服器數量變更的情況下 盡可能的減少hash的分布的變化,從沒有說能100%的規避;
從1到3 10個值變化率只有40%,普通的取模方法必定是全都掛了。
Google Guava 基礎知識
ps 範例 loadingcachegraphs cachebuilder.newbuilder maximumsize 1000 expireafterwrite 10,timeunit.minutes removallistener my listener build new cacheload...
SHMenuBar學習整理
stuido 2008 new project other languages virual c smart device win32 smart device project 生成的工程模型比較簡潔,下方menu bar 左邊是乙個用來退出程式的soft key,右邊是乙個選單。牽扯到的知識點 1...
Shader學習整理
好久沒寫部落格了,研究了一段時間shader,整理一下 unity的shader包含三種,固定渲染管線,cg片段,su ce表面著色器,unity推薦su ce表面著色器,寫起來簡單,很多東西unity都做好了,實際中往往看具體需求而定,一般選cg片段和su ce表面著色器。然而不管怎麼說,基礎理論...