Google Guava學習整理(隨筆 隨心)

2021-09-17 01:11:45 字數 1698 閱讀 4734

(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表面著色器。然而不管怎麼說,基礎理論...