午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > Go語言實現布谷鳥過濾器的方法

Go語言實現布谷鳥過濾器的方法

熱門標簽:鄭州智能語音電銷機器人價格 湛江crm外呼系統排名 地圖標注免費定制店 宿遷便宜外呼系統代理商 上海極信防封電銷卡價格 重慶慶云企業400電話到哪申請 寧波語音外呼系統公司 不封卡外呼系統 仙桃400電話辦理

轉載請聲明出處哦~,本篇文章發布于luozhiyun的博客: https://www.luozhiyun.com/archives/453

介紹

在我們工作中,如果遇到如網頁 URL 去重、垃圾郵件識別、大集合中重復元素的判斷一般想到的是將集合中所有元素保存起來,然后通過比較確定。如果通過性能最好的Hash表來進行判斷,那么隨著集合中元素的增加,我們需要的存儲空間也會呈現線性增長,最終達到瓶頸。

所以很多時候會選擇使用布隆過濾器來做這件事。布隆過濾器通過一個固定大小的二進制向量或者位圖(bitmap),然后通過映射函數來將存儲到 bitmap 中的鍵值進行映射大大減少了空間成本,布隆過濾器存儲空間和插入/查詢時間都是常數 O(K)。但是隨著存入的元素數量增加,布隆過濾器誤算率會隨之增加,并且也不能刪除元素。

想要體驗布隆過濾器的插入步驟的可以看看這里: https://www.jasondavies.com/bloomfilter/

于是布谷鳥過濾器(Cuckoo filter)華麗降世了。在論文《Cuckoo Filter: Practically Better Than Bloom》中直接說到布隆過濾器的缺點:

A limitation of standard Bloom filters is that one cannot remove existing items without rebuilding the entire filter.

論文中也提到了布谷鳥過濾器4大優點:

  • It supports adding and removing items dynamically;
  • It provides higher lookup performance than traditional Bloom filters, even when close to full (e.g., 95% space utilized);
  • It is easier to implement than alternatives such as the quotient filter; and
  • It uses less space than Bloom filters in many practical applications, if the target false positive rate is less than 3%.

翻譯如下:

  1. 支持動態的新增和刪除元素;
  2. 提供了比傳統布隆過濾器更高的查找性能,即使在接近滿的情況下(比如空間利用率達到 95% 的時候);
  3. 更容易實現;
  4. 如果要求錯誤率小于3%,那么在許多實際應用中,它比布隆過濾器占用的空間更小

實現原理

簡單工作原理

可以簡單的把布谷鳥過濾器里面有兩個 hash 表T1、T2,兩個 hash 表對應兩個 hash 函數H1、H2。

具體的插入步驟如下:

  • 當一個不存在的元素插入的時候,會先根據 H1 計算出其在 T1 表的位置,如果該位置為空則可以放進去。
  • 如果該位置不為空,則根據 H2 計算出其在 T2 表的位置,如果該位置為空則可以放進去。
  • 如果T1 表和 T2 表的位置元素都不為空,那么就隨機的選擇一個 hash 表將其元素踢出。
  • 被踢出的元素會循環的去找自己的另一個位置,如果被暫了也會隨機選擇一個將其踢出,被踢出的元素又會循環找位置;
  • 如果出現循環踢出導致放不進元素的情況,那么會設置一個閾值,超出了某個閾值,就認為這個 hash 表已經幾乎滿了,這時候就需要對它進行擴容,重新放置所有元素。

下面舉一個例子來說明:

如果想要插入一個元素Z到過濾器里:

  • 首先會將Z進行 hash 計算,發現 T1 和 T2 對應的槽位1和槽位2都已經被占了;
  • 隨機將 T1 中的槽位1中的元素 X 踢出,X 的 T2 對應的槽位4已經被元素 3 占了;
  • 將 T2 中的槽位4中的元素 3 踢出,元素 3 在 hash 計算之后發現 T1 的槽位6是空的,那么將元素3放入到 T1 的槽位6中。

當 Z 插入完畢之后如下:

布谷鳥過濾器

布谷鳥過濾器和上面的實現原理結構是差不多的,不同的是上面的數組結構會存儲整個元素,而布谷鳥過濾器中只會存儲元素的幾個 bit ,稱作指紋信息。這里是犧牲了數據的精確性換取了空間效率。

上面的實現方案中,hash 表中每個槽位只能存放一個元素,空間利用率只有50%,而在布谷鳥過濾器中每個槽位可以存放多個元素,從一維變成了二維。論文中表示:

With k = 2 hash functions, the load factor α is 50% when the bucket size b = 1 (i.e., the hash table is directly mapped), but increases to 84%, 95% or 98% respectively using bucket size b = 2, 4 or 8.

也就是當有兩個 hash 函數的時候,使用一維數組空間利用率只有50%,當每個槽位可以存放2,4,8個元素的時候,空間利用率就會飆升到 84%,95%,98%。

如下圖,表示的是一個二維數組,每個槽位可以存放 4 個元素,和上面的實現有所不同的是,沒有采用兩個數組來存放,而是只用了一個:

說完了數據結構的改變,下面再說說位置計算的改變。

我們在上面簡單實現的位置計算公式是這樣做的:

p1 = hash1(x) % 數組長度
p2 = hash2(x) % 數組長度

而布谷鳥過濾器計算位置公式可以在論文中看到是這樣:

f = fingerprint(x);
i1 = hash(x);
i2 = i1 ⊕ hash( f);

我們可以看到在計算位置 i2 的時候是通過 i1 和元素 X 對應的指紋信息取異或計算出來。指紋信息在上面已經解釋過了,是元素 X 的幾個 bit ,犧牲了一定精度,但是換取了空間。

那么這里為什么需要用到異或呢?因為這樣可以用到異或的自反性: A ⊕ B ⊕ B = A ,這樣就不需要知道當前的位置是 i1 還是 i2,只需要將當前的位置和 hash(f) 進行異或計算就可以得到另一個位置。

這里有個細節需要注意的是,計算 i2 的時候是需要先將元素 X 的 fingerprint 進行 hash ,然后才取異或,論文也說明了:

If the alternate location were calculated by “i⊕fingerprint” without hashing the fingerprint, the items kicked out from nearby buckets would land close to each other in the table, if the size of the fingerprint is small compared to the table size.

如果直接進行異或處理,那么很可能 i1 和 i2 的位置相隔很近,尤其是在比較小的 hash 表中,這樣無形之中增加了碰撞的概率。

除此之外還有一個約束條件是布谷鳥過濾器強制數組的長度必須是 2 的指數,所以在布谷鳥過濾器中不需要對數組的長度取模,取而代之的是取 hash 值的最后 n 位。

如一個布谷鳥過濾器中數組的長度2^8即256,那么取 hash 值的最后 n 位即: hash 255 這樣就可以得到最終的位置信息。如下最后得到位置信息是 23 :

代碼實現

數據結構

const bucketSize = 4
type fingerprint byte
// 二維數組,大小是4
type bucket [bucketSize]fingerprint

type Filter struct {
	// 一維數組
	buckets []bucket
	// Filter 中已插入的元素
	count  uint
	// 數組buckets長度中對應二進制包含0的個數
	bucketPow uint
}

在這里我們假定一個指紋 fingerprint 占用的字節數是 1byte ,每個位置有 4 個座位。

初始化

var (
	altHash = [256]uint{}
	masks = [65]uint{}
)

func init() {
	for i := 0; i  256; i++ {
  // 用于緩存 256 個fingerprint的hash信息
		altHash[i] = (uint(metro.Hash64([]byte{byte(i)}, 1337)))
	}
	for i := uint(0); i = 64; i++ {
  // 取 hash 值的最后 n 位
		masks[i] = (1  i) - 1
	}
}

這個 init 函數會緩存初始化兩個全局變量 altHash 和 masks。因為 fingerprint 長度是 1byte ,所以在初始化 altHash 的時候使用一個 256 大小的數組取緩存對應的 hash 信息,避免每次都需要重新計算;masks 是用來取 hash 值的最后 n 位,稍后會用到。

我們會使用一個 NewFilter 函數,通過傳入過濾器可容納大小來獲取過濾器 Filter:

func NewFilter(capacity uint) *Filter {
 // 計算 buckets 數組大小
	capacity = getNextPow2(uint64(capacity)) / bucketSize
	if capacity == 0 {
		capacity = 1
	}
	buckets := make([]bucket, capacity)
	return Filter{
		buckets: buckets,
		count:  0,
  // 獲取 buckets 數組大小的二進制中以 0 結尾的個數
		bucketPow: uint(bits.TrailingZeros(capacity)),
	}
}

NewFilter 函數會通過 getNextPow2 將 capacity 調整到 2 的指數倍,如果傳入的 capacity 是 9 ,那么調用 getNextPow2 后會返回 16;然后計算好 buckets 數組長度,實例化 Filter 返回;bucketPow 返回的是二進制中以 0 結尾的個數,因為 capacity 是 2 的指數倍,所以 bucketPow 是 capacity 二進制的位數減 1。

插入元素

func (cf *Filter) Insert(data []byte) bool {
	// 獲取 data 的 fingerprint 以及 位置 i1
	i1, fp := getIndexAndFingerprint(data, cf.bucketPow)
	// 將 fingerprint 插入到 Filter 的 buckets 數組中
	if cf.insert(fp, i1) {
		return true
	}
	// 獲取位置 i2
	i2 := getAltIndex(fp, i1, cf.bucketPow)
	// 將 fingerprint 插入到 Filter 的 buckets 數組中
	if cf.insert(fp, i2) {
		return true
	}
	// 插入失敗,那么進行循環插入踢出元素
	return cf.reinsert(fp, randi(i1, i2))
}

func (cf *Filter) insert(fp fingerprint, i uint) bool {
 // 獲取 buckets 中的槽位進行插入
	if cf.buckets[i].insert(fp) {
  // Filter 中元素個數+1
		cf.count++
		return true
	}
	return false
}

func (b *bucket) insert(fp fingerprint) bool {
 // 遍歷槽位的 4 個元素,如果為空則插入
	for i, tfp := range b {
		if tfp == nullFp {
			b[i] = fp
			return true
		}
	}
	return false
}
  • getIndexAndFingerprint 函數會獲取 data 的指紋 fingerprint,以及位置 i1;
  • 然后調用 insert 插入到 Filter 的 buckets 數組中,如果 buckets 數組中對應的槽位 i1 的 4 個元素已經滿了,那么嘗試獲取位置 i2 ,并將元素嘗試插入到 buckets 數組中對應的槽位 i2 中;
  • 對應的槽位 i2 也滿了,那么 調用 reinsert 方法隨機獲取槽位 i1、i2 中的某個位置進行搶占,然后將老元素踢出并循環重復插入。

下面看看 getIndexAndFingerprint 是如何獲取 fingerprint 以及槽位 i1:

func getIndexAndFingerprint(data []byte, bucketPow uint) (uint, fingerprint) {
 // 將 data 進行hash
	hash := metro.Hash64(data, 1337)
 // 取 hash 的指紋信息
	fp := getFingerprint(hash)
	// 取 hash 高32位,對 hash 的高32位進行取與獲取槽位 i1
	i1 := uint(hash>>32)  masks[bucketPow]
	return i1, fingerprint(fp)
}
// 取 hash 的指紋信息
func getFingerprint(hash uint64) byte {
	fp := byte(hash%255 + 1)
	return fp
}

getIndexAndFingerprint 中對 data 進行 hash 完后會對其結果取模獲取指紋信息,然后再取 hash 值的高 32 位進行取與,獲取槽位 i1。masks 在初始化的時候已經看過了, masks[bucketPow] 獲取的二進制結果全是 1 ,用來取 hash 的低位的值。

假如初始化傳入的 capacity 是1024,那么計算到 bucketPow 是 8,對應取到 masks[8] = (1 8) - 1 結果是 255 ,二進制是 1111,1111 ,和 hash 的高 32 取與 得到最后 buckets 中的槽位 i1 :

func getAltIndex(fp fingerprint, i uint, bucketPow uint) uint {
	mask := masks[bucketPow]
	hash := altHash[fp]  mask
	return i ^ hash
}

getAltIndex 中獲取槽位是通過使用 altHash 來獲取指紋信息的 hash 值,然后取異或后返回槽位值。需要注意的是,這里由于異或的特性,所以傳入的不管是槽位 i1,還是槽位 i2 都可以返回對應的另一個槽位。

下面看看循環踢出插入 reinsert:

const maxCuckooCount = 500

func (cf *Filter) reinsert(fp fingerprint, i uint) bool {
 // 默認循環 500 次
	for k := 0; k  maxCuckooCount; k++ {
  // 隨機從槽位中選取一個元素
		j := rand.Intn(bucketSize)
		oldfp := fp
  // 獲取槽位中的值 
		fp = cf.buckets[i][j]
  // 將當前循環的值插入
		cf.buckets[i][j] = oldfp

		// 獲取另一個槽位
		i = getAltIndex(fp, i, cf.bucketPow)
		if cf.insert(fp, i) {
			return true
		}
	}
	return false
}

這里會最大循環 500 次獲取槽位信息。因為每個槽位最多可以存放 4 個元素,所以使用 rand 隨機從 4 個位置中取一個元素踢出,然后將當次循環的元素插入,再獲取被踢出元素的另一個槽位信息,再調用 insert 進行插入。

上圖展示了元素 X 在插入到 hash 表的時候,hash 兩次發現對應的槽位 0 和 3 都已經滿了,那么隨機搶占了槽位 3 其中一個元素,被搶占的元素重新 hash 之后插入到槽位 5 的第三個位置上。

查詢數據

查詢數據的時候,就是看看對應的位置上有沒有對應的指紋信息:

func (cf *Filter) Lookup(data []byte) bool {
 // 獲取槽位 i1 以及指紋信息
	i1, fp := getIndexAndFingerprint(data, cf.bucketPow)
 // 遍歷槽位中 4 個位置,查看有沒有相同元素
	if cf.buckets[i1].getFingerprintIndex(fp) > -1 {
		return true
	}
 // 獲取另一個槽位 i2
	i2 := getAltIndex(fp, i1, cf.bucketPow)
 // 遍歷槽位 i2 中 4 個位置,查看有沒有相同元素
	return cf.buckets[i2].getFingerprintIndex(fp) > -1
}

func (b *bucket) getFingerprintIndex(fp fingerprint) int {
	for i, tfp := range b {
		if tfp == fp {
			return i
		}
	}
	return -1
}

刪除數據

刪除數據的時候,也只是抹掉該槽位上的指紋信息:

func (cf *Filter) Delete(data []byte) bool {
 // 獲取槽位 i1 以及指紋信息
	i1, fp := getIndexAndFingerprint(data, cf.bucketPow)
 // 嘗試刪除指紋信息
	if cf.delete(fp, i1) {
		return true
	}
 // 獲取槽位 i2
	i2 := getAltIndex(fp, i1, cf.bucketPow)
 // 嘗試刪除指紋信息
	return cf.delete(fp, i2)
}

func (cf *Filter) delete(fp fingerprint, i uint) bool {
 // 遍歷槽位 4個元素,嘗試刪除指紋信息
	if cf.buckets[i].delete(fp) {
		if cf.count > 0 {
			cf.count--
		}
		return true
	}
	return false
}

func (b *bucket) delete(fp fingerprint) bool {
	for i, tfp := range b {
  // 指紋信息相同,將此槽位置空
		if tfp == fp {
			b[i] = nullFp
			return true
		}
	}
	return false
}

缺點

實現完布谷鳥過濾器后,我們不妨想一下,如果布谷鳥過濾器對同一個元素進行多次連續的插入會怎樣?

那么這個元素會霸占兩個槽位上的所有位置,最后在插入第 9 個相同元素的時候,會一直循環擠兌,直到最大循環次數,然后返回一個 false:

如果插入之前做一次檢查能不能解決問題呢?這樣確實不會出現循環擠兌的情況,但是會出現一定概率的誤判情況。

由上面的實現我們可以知道,在每個位置里設置的指紋信息是 1byte,256 種可能,如果兩個元素的 hash 位置相同,指紋相同,那么這個插入檢查會認為它們是相等的導致認為元素已存在。

事實上,我們可以通過調整指紋信息的保存量來降低誤判情況,如在上面的實現中,指紋信息是 1byte 保存8位信息誤判概率是0.03,當指紋信息增加到 2bytes 保存16位信息誤判概率會降低至 0.0001。

Reference

Cuckoo Filter: Practically Better Than Bloom https://www.cs.cmu.edu/~dga/papers/cuckoo-conext2014.pdf

Cuckoo Hashing Visualization http://www.lkozma.net/cuckoo_hashing_visualization/

Cuckoo Filter https://github.com/seiflotfy/cuckoofilter

到此這篇關于Go語言實現布谷鳥過濾器的方法的文章就介紹到這了,更多相關Go 布谷鳥過濾器內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 深入理解Django的自定義過濾器
  • 詳解django中自定義標簽和過濾器
  • 在Django框架中自定義模板過濾器的方法
  • 詳解Django中的過濾器

標簽:海南 遼寧 電子產品 安康 西雙版納 青海 物業服務 儋州

巨人網絡通訊聲明:本文標題《Go語言實現布谷鳥過濾器的方法》,本文關鍵詞  語言,實現,布谷鳥,過濾器,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go語言實現布谷鳥過濾器的方法》相關的同類信息!
  • 本頁收集關于Go語言實現布谷鳥過濾器的方法的相關信息資訊供網民參考!
  • 推薦文章
    欧美与黑人午夜性猛交久久久| 久久99国产精品麻豆| 欧美午夜精品一区| 国产一区二区三区高清| 欧美三级黄色大片| 国产精品理伦片| 国产成人黄色av| 少妇饥渴放荡91麻豆| 成人激情小说网站| 欧美风情在线观看| 一级黄色免费毛片| 久久久亚洲人| 日韩免费观看高清完整版在线观看| 一区二区不卡在线观看| 中文字幕在线播放av| 欧美顶级少妇做爰| 一区二区免费电影| 亚洲无码久久久久| 7777精品伊人久久久大香线蕉 | 在线成人激情黄色| 亚洲精品天堂成人片av在线播放| 国产精品毛片久久久久久久av| 欧美久久久久久久久| 亚洲精品偷拍视频| 亚洲精品福利网站| 精品视频在线播放| 欧美无砖专区免费| 国产精品久久久久久久一区二区 | 欧美电视剧在线看免费| 黄色一级视频播放| 丰满岳乱妇国产精品一区| 日韩av一区二区在线| 欧美少妇一级片| 久久国产精品99精品国产| 粉嫩老牛aⅴ一区二区三区| 精品福利影视| 日韩免费在线视频观看| 欧美日韩精品一区二区天天拍小说| 亚洲激情啪啪| 亚洲国产精品成人久久蜜臀| 亚洲欧美国产va在线影院| 一区二区在线播放视频| 蜜桃一区二区三区四区| 久久频这里精品99香蕉| 手机免费观看av| 韩曰欧美视频免费观看| 久久福利一区二区| 免费欧美在线视频| 97人人做人人爱| 久草福利资源在线| 色综合久久99| 欧美精品久久久久久久久久久| 久久精品噜噜噜成人av农村| 97免费视频在线| 青青操国产视频| 9191成人精品久久| 伊人成色综合网| 成人性生交大片免费看中文| 91免费福利视频| 五月婷婷激情五月| 亚洲人成网站999久久久综合| 日本性生活一级片| 亚洲香蕉伊在人在线观| 水蜜桃亚洲精品| 日本少妇一区二区| 欧美另类极品videosbestfree| 久久久久亚洲av成人无码电影| 亚洲精品国产a久久久久久 | 亚洲最大成人网色| 久久免费小视频| 欧美精品18+| 黄色高清无遮挡| 中文字幕在线不卡视频| 无码毛片aaa在线| av一区二区三区四区| 国产综合色一区二区三区| 亚洲va欧美va| 国产91精品青草社区| 特级西西444www大胆免费看| 欧美情侣性视频| 99热只有这里有精品| 中文字幕在线看视频国产欧美在线看完整| 国产亚洲精品久久久久久豆腐| 精品免费国产一区二区三区四区| 性活交片大全免费看| 欧美性xxxx极品高清hd直播| 亚洲一区二区中文字幕在线观看| 精品毛片网大全| 欧美一级特黄aaa| 亚洲综合视频网| 日本xxxx黄色| 日本韩国精品在线| 中文字幕影片免费在线观看| 日韩午夜三级在线| 国产wwwwxxxx| 日韩成人在线网站| 日本三级欧美三级| 日韩精品免费在线| 校园春色 亚洲| 久色乳综合思思在线视频| 久久亚洲精品石原莉奈| 在线播放国产一区中文字幕剧情欧美 | 中日韩午夜理伦电影免费| 五月天婷婷丁香| 欧美重口另类videos人妖| 又嫩又硬又黄又爽的视频| 欧美成人综合网站| 国产精品 欧美激情| 亚洲欧美激情精品一区二区| 久草视频精品在线| 亚洲国产精品视频| 97久久天天综合色天天综合色hd| 日韩电影在线免费观看| 日本中文不卡| 亚洲欧洲国产日韩| av网址在线观看免费| 亚洲午夜久久久久久久久电影网 | 韩国一区二区三区美女美女秀| 国内成+人亚洲+欧美+综合在线 | 色综合一个色综合亚洲| 成人黄色a级片| 亚洲欧美国产精品| 伦av综合一区| 国产美女久久精品香蕉69| 久久精品国产77777蜜臀| 97在线免费视频观看| 一本色道久久综合精品竹菊| 青青草在线观看视频| 色婷婷av一区二区三区在线观看 | 日韩精品一区二区在线视频| 亚洲国产综合色| 中文字幕人妻一区二区| 亚洲美女av电影| 男人的天堂一区二区| 国产美女精品视频| 成人avav在线| 日本国产一级片| 亚洲精品视频网上网址在线观看| 伊人久久久久久久久久久久| 92裸体在线视频网站| 26uuu欧美| 亚洲美女精品视频| 中文字幕在线精品| 亚洲欧美日韩成人在线| 2022中文字幕| 色哟哟欧美精品| avtt天堂在线| 成人啪啪免费看| 国产精品久久综合| 91激情视频在线观看| 精品国模在线视频| 久久一二三四| 黄色片视频在线播放| 日韩av在线免播放器| 亚洲免费黄色片| 日韩资源av在线| 欧美性色黄大片| 中文无码av一区二区三区| 欧美精品免费观看二区| 欧美视频二区36p| 国产精品21p| 国产一区二区在线观看免费播放| 亚洲激情欧美激情| 劲爆欧美第一页| 成人免费网站在线| 亚洲美女少妇撒尿| 少妇光屁股影院| 国产精品高清在线观看| 国产精品美女视频| 久久国产精品影院| 国产a级全部精品| 91在线porny国产在线看| 中文字幕在线播放一区| 欧美激情va永久在线播放| av在线不卡免费看| 欧美激情 一区| 成人看片人aa| 亚洲综合精品自拍| 免费看日批视频| 91香蕉国产在线观看| 亚洲美女免费在线| 日韩免费视频一区二区视频在线观看| 免费国产一区二区| 日韩一区二区三区精品视频| 少妇av一区二区| 国产成人精品视频ⅴa片软件竹菊| 中文字幕精品在线视频| 福利一区二区在线观看| 久久久精品成人| 狠狠色噜噜狠狠狠狠色吗综合 | 日韩午夜电影在线观看| 日本网站在线观看一区二区三区| 一级黄色片在线免费观看| 欧美洲成人男女午夜视频| 亚洲一级在线观看| 国产精品一区二区免费视频| 国产96在线 | 亚洲| 免费成人高清视频| 亚洲三级在线免费| 波多野结衣电影在线播放| 日韩在线一级片| 欧美黑人一区二区三区| 亚洲精品成人少妇| 中文字幕免费在线看| 国产九九热视频| 成人国产精品日本在线| 欧美综合天天夜夜久久| 午夜av入18在线| 星空大象在线观看免费播放| 精品日本一区二区三区在线观看| 亚洲韩国日本中文字幕| 久久综合色8888| 男女免费视频网站| 国产美女主播在线播放| 456亚洲影院| 欧美亚洲一区二区三区四区| 麻豆国产欧美日韩综合精品二区| 丝袜美腿中文字幕| 欧美一区二区三区四区夜夜大片| 亚洲欧美综合图区| 国产精品久久久一本精品 | 亚洲第一区在线观看| 99国产精品视频免费观看| 制服.丝袜.亚洲.中文.综合懂色| 国产精品视频一区二区三区四区五区| 欧美一级成年大片在线观看| 欧美色综合影院| 蜜桃av一区二区三区| 51精品免费网站| 欧美在线观看视频免费| 欧美激情一区二区三区高清视频| 亚洲欧美日韩国产综合在线 | 欧美在线亚洲在线| 制服丝袜中文字幕亚洲| 久久亚洲影视婷婷| wwwwww国产| 成人一区二区三| 亚洲va国产va天堂va久久| 欧美videos中文字幕| 国产日产欧产精品推荐色| 99精品免费观看| 美国黄色a级片| 久久视频免费在线| 捆绑变态av一区二区三区| 欧美黄色高清视频| 欧美精品色婷婷五月综合| 国产精品入口夜色视频大尺度 | 销魂美女一区二区| 亚洲av成人片无码| 中文字幕日韩精品久久| 日本高清久久天堂| 日韩精品一区二区三区第95| 国产精品女同一区二区三区| 欧美视频一二区| 久久国产露脸精品国产| 成年人视频网站免费观看| 国产视频不卡| 久精品免费视频| 日韩一区二区中文字幕| 国产精品免费视频观看| 蜜桃久久久久久久| 欧美成人精品欧美一级乱黄| 超碰caoprom| 免费成人在线视频网站| 成人av免费看| 2019中文字幕全在线观看| 日韩精品中文字幕在线观看| 精品久久久久久中文字幕| 久久你懂得1024| 麻豆免费精品视频| 一区二区三区精| 毛片aaaaa| 久久人人爽人人爽人人片| 不要播放器的av网站| 日日夜夜精品网站| 国产91ⅴ在线精品免费观看| 日韩精品极品视频免费观看| 欧美日韩亚洲精品一区二区三区| 成人视屏免费看| 少妇一级淫片免费看| 久久夜色精品国产噜噜亚洲av| 大又大又粗又硬又爽少妇毛片| 天天影视综合色| 日韩在线视频在线| 日韩少妇中文字幕| 国产精品自产拍在线观看| 欧美激情按摩在线| 亚洲激情久久久| 欧美一区二区视频网站| 一本一道久久a久久精品综合蜜臀 一本一道综合狠狠老 | 亚洲免费观看视频| 男女视频一区二区| 一个人看的www日本高清视频| 欧美成人免费观看视频| 中文字幕国产专区| 中文字幕免费高清视频| www.桃色.com| 视频在线观看免费高清| 黄色片一级视频| 裸体大乳女做爰69| 精品欧美日韩| 成人在线中文字幕| 国产精品久久久久久久app| 欧美性资源免费| 久久久久久亚洲精品| 日韩av综合中文字幕| 精品国产伦一区二区三区免费 | 最新中文字幕久久| 国产精品免费视频一区二区| 日本不卡高字幕在线2019| 91国内揄拍国内精品对白| 麻豆乱码国产一区二区三区| 亚洲欧美在线免费| 国产亚洲欧美另类中文| 中文字幕久热精品在线视频| 亚洲精品wwwww| 欧美一区二区三区啪啪| 欧美日韩中字一区| 欧美剧情电影在线观看完整版免费励志电影 | aaa一区二区三区| 国产视频在线一区| 国产黄色一区二区| 日本黄视频在线观看| 成人免费视频国产| 午夜在线观看视频18| 天天干天天草天天射| 香蕉视频黄色片| 水野朝阳av一区二区三区| 丁香花免费高清完整在线播放 | 成人免费看片'免费看| 成年人视频大全| 中国丰满人妻videoshd| 污污动漫在线观看| 国产日韩视频一区| 国产交换配乱淫视频免费| 殴美一级黄色片| www.av免费| 欧美精品亚洲精品日韩精品| 最近中文字幕在线免费观看| 亚洲无码精品一区二区三区| 进去里视频在线观看| 91国在线视频| 日本vs亚洲vs韩国一区三区| 蜜臀av亚洲一区中文字幕| 免费在线观看精品| 成人动漫一区二区三区| 久久久久一区二区三区四区| 国产蜜臀av在线一区二区三区| 中文字幕日本乱码精品影院| 激情久久av一区av二区av三区 | 91传媒免费看| 黄色一级视频播放| 在线免费看污网站| 五月天六月丁香| 少妇精品一区二区三区| 日韩免费一二三区| 国产成人精品免费看视频| 国产精品99久久久久久宅男| 91亚洲男人天堂| 午夜av一区二区| 日韩欧美一级二级三级| 欧美乱妇40p| 精品在线不卡| 日韩欧美不卡在线| 国产精品久久久久久在线观看| 亚洲一区二区91| 天堂蜜桃91精品| 国产精品久久免费看| 欧美美女网站色| 欧美激情一区二区三区高清视频 | 日韩精品最新网址| 日本亚洲欧洲色α| 精品999在线观看| 可以免费在线看黄的网站| 国产91在线播放九色| 成人久久精品人妻一区二区三区| 国产大片一区二区| 欧美午夜激情在线| 久久久97精品| 亚洲一区二区自拍| 欧美视频第一区| 精品人妻一区二区三区四区| 亚洲在线精品视频| 成人免费视频国产| 国产精品美女久久福利网站| 欧美剧情电影在线观看完整版免费励志电影 | 亚洲美女爱爱视频| 国产免费美女视频| 亚洲AV无码成人片在线观看| 99久久精品国产网站| 欧美视频二区36p| 国产一区二区日韩| 51国偷自产一区二区三区| 糖心vlog在线免费观看| 午夜剧场免费看| www.色国产| 91蜜桃婷婷狠狠久久综合9色| 色网综合在线观看| 性日韩欧美在线视频| 欧美性天天影院| 一区二区免费在线观看视频| 一级片视频在线观看| 91香蕉视频污在线| 欧美日韩国产乱码电影| 欧美激情一级欧美精品| 好色先生视频污| 久久久久久久毛片| 亚洲av电影一区| 一本色道**综合亚洲精品蜜桃冫| 久久久久五月天|