成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > PHP哈希表實現(xiàn)算法原理解析

PHP哈希表實現(xiàn)算法原理解析

熱門標(biāo)簽:中原區(qū)電話機器人價格 招標(biāo)自動語音外呼系統(tǒng) 黔江400電話如何辦理 地圖標(biāo)注視頻廣告入駐 gps 地圖標(biāo)注軟件 400電話鄭州申請 OMG地圖標(biāo)注app 電銷機器人便宜的有嗎 ai電話機器人加盟代理

在PHP內(nèi)核中,其中一個很重要的數(shù)據(jù)結(jié)構(gòu)就是HashTable。我們常用的數(shù)組,在內(nèi)核中就是用HashTable來實現(xiàn)。那么,PHP的HashTable是怎么實現(xiàn)的呢?最近在看HashTable的數(shù)據(jù)結(jié)構(gòu),但是算法書籍里面沒有具體的實現(xiàn)算法,剛好最近也在閱讀PHP的源碼,于是參考PHP的HashTable的實現(xiàn),自己實現(xiàn)了一個簡易版的HashTable,總結(jié)了一些心得,下面給大家分享一下。

HashTable的介紹

哈希表是實現(xiàn)字典操作的一種有效數(shù)據(jù)結(jié)構(gòu)。

定義

簡單地說,HashTable(哈希表)就是一種鍵值對的數(shù)據(jù)結(jié)構(gòu)。支持插入,查找,刪除等操作。在一些合理的假設(shè)下,在哈希表中的所有操作的時間復(fù)雜度是O(1)(對相關(guān)證明感興趣的可以自行查閱)。

實現(xiàn)哈希表的關(guān)鍵

在哈希表中,不是使用關(guān)鍵字做下標(biāo),而是通過哈希函數(shù)計算出key的哈希值作為下標(biāo),然后查找/刪除時再計算出key的哈希值,從而快速定位元素保存的位置。

在一個哈希表中,不同的關(guān)鍵字可能會計算得到相同的哈希值,這叫做“哈希沖突”,就是處理兩個或多個鍵的哈希值相同的情況。解決哈希沖突的方法有很多,開放尋址法,拉鏈法等等。

因此,實現(xiàn)一個好的哈希表的關(guān)鍵就是一個好的哈希函數(shù)和處理哈希沖突的方法。

Hash函數(shù)

判斷一個哈希算法的好壞有以下定義:

  • 一致性,等價的鍵必然產(chǎn)生相等的哈希值;
  • 高效性,計算簡便;
  • 均勻性,均勻地對所有的鍵進行哈希。
  • 哈希函數(shù)建立了關(guān)鍵值與哈希值的對應(yīng)關(guān)系,即:h = hash_func(key)。對應(yīng)關(guān)系見下圖:

hash-exam

設(shè)計一個完美的哈希函數(shù)就交由專家去做吧,我們只管用已有的較成熟的哈希函數(shù)就好了。PHP內(nèi)核使用的哈希函數(shù)是time33函數(shù),又叫DJBX33A,其實現(xiàn)如下:

static inline ulong zend_inline_hash_func(const char *arKey, uint nKeyLength)
{
     register ulong hash = 5381;

    /* variant with the hash unrolled eight times */
    for (; nKeyLength >= 8; nKeyLength -= 8) {
      hash = ((hash  5) + hash) + *arKey++;
      hash = ((hash  5) + hash) + *arKey++;
      hash = ((hash  5) + hash) + *arKey++;
      hash = ((hash  5) + hash) + *arKey++;
      hash = ((hash  5) + hash) + *arKey++;
      hash = ((hash  5) + hash) + *arKey++;
      hash = ((hash  5) + hash) + *arKey++;
      hash = ((hash  5) + hash) + *arKey++;
  }

  switch (nKeyLength) {
    case 7: hash = ((hash  5) + hash) + *arKey++; /* fallthrough... */
    case 6: hash = ((hash  5) + hash) + *arKey++; /* fallthrough... */
    case 5: hash = ((hash  5) + hash) + *arKey++; /* fallthrough... */
    case 4: hash = ((hash  5) + hash) + *arKey++; /* fallthrough... */
    case 3: hash = ((hash  5) + hash) + *arKey++; /* fallthrough... */
    case 2: hash = ((hash  5) + hash) + *arKey++; /* fallthrough... */
    case 1: hash = ((hash  5) + hash) + *arKey++; break;
    case 0: break;
    EMPTY_SWITCH_DEFAULT_CASE()
  }
  return hash;
}

注:函數(shù)使用了一個8次循環(huán)+switch來實現(xiàn),是對for循環(huán)的優(yōu)化,減少循環(huán)的運行次數(shù),然后在switch里面執(zhí)行剩下的沒有遍歷到的元素。

拉鏈法

將所有具有相同哈希值的元素都保存在一條鏈表中的方法叫拉鏈法。查找的時候通過先計算key對應(yīng)的哈希值,然后根據(jù)哈希值找到對應(yīng)的鏈表,最后沿著鏈表順序查找相應(yīng)的值。

PHP的HashTable結(jié)構(gòu)

簡單地介紹了哈希表的數(shù)據(jù)結(jié)構(gòu)之后,繼續(xù)看看PHP中是如何實現(xiàn)哈希表的。

PHP內(nèi)核hashtable的定義:

typedef struct _hashtable {
     uint nTableSize;
     uint nTableMask;
     uint nNumOfElements;
     ulong nNextFreeElement;
     Bucket *pInternalPointer;
     Bucket *pListHead;
     Bucket *pListTail; 
     Bucket **arBuckets;
     dtor_func_t pDestructor;
     zend_bool persistent;
     unsigned char nApplyCount;
     zend_bool bApplyProtection;
     #if ZEND_DEBUG
        int inconsistent;
     #endif
} HashTable;
  • nTableSize,HashTable的大小,以2的倍數(shù)增長
  • nTableMask,用在與哈希值做與運算獲得該哈希值的索引取值,arBuckets初始化后永遠是nTableSize-1
  • nNumOfElements,HashTable當(dāng)前擁有的元素個數(shù),count函數(shù)直接返回這個值
  • nNextFreeElement,表示數(shù)字鍵值數(shù)組中下一個數(shù)字索引的位置
  • pInternalPointer,內(nèi)部指針,指向當(dāng)前成員,用于遍歷元素
  • pListHead,指向HashTable的第一個元素,也是數(shù)組的第一個元素
  • pListTail,指向HashTable的最后一個元素,也是數(shù)組的最后一個元素。與上面的指針結(jié)合,在遍歷數(shù)組時非常方便,比如reset和endAPI
  • arBuckets,包含bucket組成的雙向鏈表的數(shù)組,索引用key的哈希值和nTableMask做與運算生成
  • pDestructor,刪除哈希表中的元素使用的析構(gòu)函數(shù)
  • persistent,標(biāo)識內(nèi)存分配函數(shù),如果是TRUE,則使用操作系統(tǒng)本身的內(nèi)存分配函數(shù),否則使用PHP的內(nèi)存分配函數(shù)
  • nApplyCount,保存當(dāng)前bucket被遞歸訪問的次數(shù),防止多次遞歸
  • bApplyProtection,標(biāo)識哈希表是否要使用遞歸保護,默認是1,要使用

舉一個哈希與mask結(jié)合的例子:

例如,”foo”真正的哈希值(使用DJBX33A哈希函數(shù))是193491849。如果我們現(xiàn)在有64容量的哈希表,我們明顯不能使用它作為數(shù)組的下標(biāo)。取而代之的是通過應(yīng)用哈希表的mask,然后只取哈希表的低位。

hash      |    193491849 |   0b1011100010000111001110001001
 mask     |        63 |   0b0000000000000000000000111111
----------------------------------------------------------------------
= index    | = 9        | =  0b0000000000000000000000001001

因此,在哈希表中,foo是保存在arBuckets中下標(biāo)為9的bucket向量中。

bucket結(jié)構(gòu)體的定義

typedef struct bucket {
   ulong h;
   uint nKeyLength;
   void *pData;
   void *pDataPtr;
   struct bucket *pListNext;
   struct bucket *pListLast;
   struct bucket *pNext;
   struct bucket *pLast;
   const char *arKey;
} Bucket;
  • h,哈希值(或數(shù)字鍵值的key
  • nKeyLength,key的長度
  • pData,指向數(shù)據(jù)的指針
  • pDataPtr,指針數(shù)據(jù)
  • pListNext,指向HashTable中的arBuckets鏈表中的下一個元素
  • pListLast,指向HashTable中的arBuckets鏈表中的上一個元素
  • pNext,指向具有相同hash值的bucket鏈表中的下一個元素
  • pLast,指向具有相同hash值的bucket鏈表中的上一個元素
  • arKey,key的名稱

PHP中的HashTable是采用了向量加雙向鏈表的實現(xiàn)方式,向量在arBuckets變量保存,向量包含多個bucket的指針,每個指針指向由多個bucket組成的雙向鏈表,新元素的加入使用前插法,即新元素總是在bucket的第一個位置。由上面可以看到,PHP的哈希表實現(xiàn)相當(dāng)復(fù)雜。這是它使用超靈活的數(shù)組類型要付出的代價。

HashTable相關(guān)API

  • zend_hash_init
  • zend_hash_add_or_update
  • zend_hash_find
  • zend_hash_del_key_or_index

zend_hash_init

函數(shù)執(zhí)行步驟

設(shè)置哈希表大小

設(shè)置結(jié)構(gòu)體其他成員變量的初始值 (包括釋放內(nèi)存用的析構(gòu)函數(shù)pDescructor)
詳細代碼注解點擊:zend_hash_init源碼

注:

1、pHashFunction在此處并沒有用到,php的哈希函數(shù)使用的是內(nèi)部的zend_inline_hash_func

2、zend_hash_init執(zhí)行之后并沒有真正地為arBuckets分配內(nèi)存和計算出nTableMask的大小,真正分配內(nèi)存和計算nTableMask是在插入元素時進行CHECK_INIT檢查初始化時進行。

zend_hash_add_or_update

函數(shù)執(zhí)行步驟

  • 檢查鍵的長度
  • 檢查初始化
  • 計算哈希值和下標(biāo)
  • 遍歷哈希值所在的bucket,如果找到相同的key且值需要更新,則更新數(shù)據(jù),否則繼續(xù)指向bucket的下一個元素,直到指向bucket的最后一個位置
  • 為新加入的元素分配bucket,設(shè)置新的bucket的屬性值,然后添加到哈希表中

如果哈希表空間滿了,則重新調(diào)整哈希表的大小

zend_hash_add_or_update

CONNECT_TO_BUCKET_DLLIST是將新元素添加到具有相同hash值的bucket鏈表。

CONNECT_TO_GLOBAL_DLLIST是將新元素添加到HashTable的雙向鏈表。

詳細代碼和注解請點擊:zend_hash_add_or_update代碼注解。

zend_hash_find

函數(shù)執(zhí)行步驟

  • 計算哈希值和下標(biāo)
  • 遍歷哈希值所在的bucket,如果找到key所在的bucket,則返回值,否則,指向下一個bucket,直到指向bucket鏈表中的最后一個位置

詳細代碼和注解請點擊:zend_hash_find代碼注解。

zend_hash_del_key_or_index

函數(shù)執(zhí)行步驟

  • 計算key的哈希值和下標(biāo)
  • 遍歷哈希值所在的bucket,如果找到key所在的bucket,則進行第三步,否則,指向下一個bucket,直到指向bucket鏈表中的最后一個位置
  • 如果要刪除的是第一個元素,直接將arBucket[nIndex]指向第二個元素;其余的操作是將當(dāng)前指針的last的next執(zhí)行當(dāng)前的next
  • 調(diào)整相關(guān)指針
  • 釋放數(shù)據(jù)內(nèi)存和bucket結(jié)構(gòu)體內(nèi)存

詳細代碼和注解請點擊:zend_hash_del_key_or_index代碼注解。

性能分析

PHP的哈希表的優(yōu)點:PHP的HashTable為數(shù)組的操作提供了很大的方便,無論是數(shù)組的創(chuàng)建和新增元素或刪除元素等操作,哈希表都提供了很好的性能,但其不足在數(shù)據(jù)量大的時候比較明顯,從時間復(fù)雜度和空間復(fù)雜度看看其不足。

不足如下:

  • 保存數(shù)據(jù)的結(jié)構(gòu)體zval需要單獨分配內(nèi)存,需要管理這個額外的內(nèi)存,每個zval占用了16bytes的內(nèi)存;
  • 在新增bucket時,bucket也是額外分配,也需要16bytes的內(nèi)存;
  • 為了能進行順序遍歷,使用雙向鏈表連接整個HashTable,多出了很多的指針,每個指針也要16bytes的內(nèi)存;
  • 在遍歷時,如果元素位于bucket鏈表的尾部,也需要遍歷完整個bucket鏈表才能找到所要查找的值

PHP的HashTable的不足主要是其雙向鏈表多出的指針及zval和bucket需要額外分配內(nèi)存,因此導(dǎo)致占用了很多內(nèi)存空間及查找時多出了不少時間的消耗。

后續(xù)

上面提到的不足,在PHP7中都很好地解決了,PHP7對內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)做了一個大改造,使得PHP的效率高了很多,因此,推薦PHP開發(fā)者都將開發(fā)和部署版本更新吧??纯聪旅孢@段PHP代碼:

?php
$size = pow(2, 16); 
 
$startTime = microtime(true);
$array = array();
for ($key = 0, $maxKey = ($size - 1) * $size; $key = $maxKey; $key += $size) {
  $array[$key] = 0;
}
$endTime = microtime(true);
echo '插入 ', $size, ' 個惡意的元素需要 ', $endTime - $startTime, ' 秒', "\n";
 
$startTime = microtime(true);
$array = array();
for ($key = 0, $maxKey = $size - 1; $key = $maxKey; ++$key) {
  $array[$key] = 0;
}
$endTime = microtime(true);
echo '插入 ', $size, ' 個普通元素需要 ', $endTime - $startTime, ' 秒', "\n";

上面這個demo是有多個hash沖突時和無沖突時的時間消耗比較。筆者在PHP5.4下運行這段代碼,結(jié)果如下

插入 65536 個惡意的元素需要 43.72204709053 秒

插入 65536 個普通元素需要 0.009843111038208 秒

而在PHP7上運行的結(jié)果:

插入 65536 個惡意的元素需要 4.4028408527374 秒

插入 65536 個普通元素需要 0.0018510818481445 秒

可見不論在有沖突和無沖突的數(shù)組操作,PHP7的性能都提升了不少,當(dāng)然,有沖突的性能提升更為明顯。至于為什么PHP7的性能提高了這么多,值得繼續(xù)深究。

最后再安利一下,筆者github上有一個簡易版的HashTable的實現(xiàn):HashTable實現(xiàn)

另外,我在github有對PHP源碼更詳細的注解。感興趣的可以圍觀一下,給個star。PHP5.4源碼注解??梢酝ㄟ^commit記錄查看已添加的注解。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • PHP實現(xiàn)的服務(wù)器一致性hash分布算法示例
  • PHP實現(xiàn)的一致性哈希算法完整實例
  • PHP內(nèi)核探索:哈希表碰撞攻擊原理
  • PHP中創(chuàng)建和驗證哈希的簡單方法實探
  • php內(nèi)核解析:PHP中的哈希表
  • php-perl哈希算法實現(xiàn)(times33哈希算法)
  • PHP 5.5 創(chuàng)建和驗證哈希最簡單的方法詳解
  • 一致性哈希算法以及其PHP實現(xiàn)詳細解析
  • 如何用PHP實現(xiàn)分布算法之一致性哈希算法

標(biāo)簽:哈密 池州 阿里 孝感 那曲 濟源 北京 日照

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP哈希表實現(xiàn)算法原理解析》,本文關(guān)鍵詞  PHP,哈希,表,實現(xiàn),算法,原理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP哈希表實現(xiàn)算法原理解析》相關(guān)的同類信息!
  • 本頁收集關(guān)于PHP哈希表實現(xiàn)算法原理解析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    美女被内谢流白浆高视频| 欧美另类视频在线观看| 日本激情视频网| 欧美少妇一区二区| 欧美18免费视频| 18久久久久久| 国产精彩免费视频| 亚洲图片欧洲图片av| 国产一区二区日韩精品| 波多野结依一区| 亚洲人成小说网站色在线| 一区二区三欧美| 99久久伊人网影院| 欧美精选一区| 精品无码久久久久久久动漫| 中文字幕一区二区三区久久网站| 手机看片一区二区三区| 亚洲成人影院麻豆| 亚洲成人va| 午夜国产福利在线观看| 成人3d精品动漫精品一二三| 网站黄在线观看| 国产精品久久久久久久app| 青青草免费观看视频| 奇米影视亚洲狠狠色| caoporn国产精品免费视频| 日韩人妻无码精品综合区| 性欧美xxxx大乳国产app| 日日骚一区二区网站| 国产日韩影视精品| 成人免费看片98欧美| 开心色怡人综合网站| 粉嫩av性色av蜜臀av网站| av一区二区三区黑人| 国产午夜激情视频| 最新国产の精品合集bt伙计| a中文在线播放| 一级毛片国产| 欧美精品日韩精品| 色综合天天综合网天天看片| 亚洲国产天堂久久国产91| 欧美日韩大陆在线| 国产精品一区而去| 欧美美女激情18p| 日韩精品免费视频一区二区三区| 国产精品69久久久久水密桃| 亚洲理论电影| 欧美最猛性xxxxx亚洲精品| 影音国产精品| 国产夜色精品一区二区av| 粉嫩欧美一区二区三区高清影视| 欧美专区在线视频| 在线视频毛片| 电影天堂国产精品| 成人免费网站视频| 国产成人高清在线| 激情综合五月婷婷| 久久久久久久久艹| 久久久久久色| 久久一区亚洲| 九色porny丨国产精品| 成人在线网站| 中文字幕伦理免费在线视频| 全程偷拍露脸中年夫妇| 狠狠入ady亚洲精品| 精品国产无码一区二区| 五月激情丁香一区二区三区| 亚洲欧洲日产国产综合网| 91精产国品一二三| 两个人的视频www国产精品| 中文字幕中文字幕在线中文字幕三区| 日韩欧美激情电影| 偷窥国产亚洲免费视频| 亚洲黄色av网址| 日韩成人手机在线| 国产精品涩涩涩视频网站| 在线视频国内一区二区| 日本一区二区三区在线视频| 国产精品视频久久久久久久| 瑟瑟视频在线| 国产福利在线播放麻豆| 这里只有精品国产| av动漫一区二区| 国产不卡高清在线观看视频| 男人天堂av在线播放| 国产在线精品一区二区夜色| 免费下载黄色软件| 亚洲免费网站观看视频| 日韩高清影视在线观看| 日韩欧美网址| 国产三级欧美三级| 日韩成人av在线| 中文字幕免费高清电视剧网站在线观看| 日本高清视频在线播放| 一区二区免费看| 波多野结衣视频在线看| 国产波霸爆乳一区二区| 日韩欧美高清视频| 久久综合色一综合色88| 国产综合在线观看视频| 中文字幕天堂网| 亚州欧美日韩中文视频| 久久丫精品忘忧草西安产品| 美女国产一区| av在线视屏| 日本一级二级视频| 草莓视频18免费观看| 亚洲欧美色视频| 欧美日韩亚洲视频一区| h视频在线观看免费完整版| 久艹在线免费观看| 亚洲一区二区三区在线观看网站| 一本一道综合狠狠老| 国产麻豆精品一区二区| 三上悠亚免费在线观看| 久久精品免费在线观看| 亚州色图欧美色图| 精品无码国产一区二区三区51安| 亚洲制服中文| 青娱乐精品视频在线| 中文在线资源观看网站视频免费不卡| 欧美激情在线一区二区| 亚洲免费精品| 一本一道久久a久久综合精品| 热舞福利精品大尺度视频| 久久九九精品视频| 亚洲电影成人av99爱色| 亚洲中文无码av在线| 影音先锋国产精品| 在线视频观看91| 91女厕偷拍女厕偷拍高清| 中文字幕一区二区三区5566| 天天av天天爽| 国产亚洲依依| 91久久久一线二线三线品牌| 久操免费在线| 日本不卡一区二区| 深夜激情久久| 天天干天天摸| 欧美精品性生活| 天天天天天天天操| 婷婷在线播放| 亚洲人成网77777色在线播放| 视频精品一区二区三区| 91插插插插插插| 亚洲国产天堂久久综合网| 亚洲二区视频在线| 亚洲综合123| 国产精品免费在线免费| 色8久久影院午夜场| 欧美日韩dvd| 欧美黑人孕妇孕交| 久久在线电影| 精品亚洲成a人片在线观看| 亚洲在线免费视频| 啪啪av大全导航福利综合导航| 国产精品一区二区三区四区色| 玖玖爱免费视频| 久久久久亚洲精品中文字幕| 成人国产一区二区三区精品| 久久久精品日本| 香蕉视频一区二区| 国产综合久久久久久| 中文字幕一区二区三区电影| 欧美日韩免费看| 日韩高清国产一区在线| 视频在线观看免费高清| 国内精品一区视频| 久久久伦理片| 日av在线播放中文不卡| 精品一区二区在线视频| 日本人dh亚洲人ⅹxx| 日本三级免费观看| 91视频久久久| 女人高潮特级毛片| 国产日产精品一区二区三区四区| 奇米888四色在线精品| 91视频网入口| 久久久五月天| 综合自拍亚洲综合图不卡区| 国产毛片av在线| 成人性生交视频免费观看| 欧美卡1卡2卡| 亚洲国产一区二区三区在线观看| 美脚丝袜一区二区三区在线观看| 国产在线视频三区| 亚洲v片在线观看| 国产综合色精品一区二区三区| 精品国产一区二区三区成人影院| 国产最新在线| 500福利第一精品导航| 成人444kkkk在线观看| 中文字幕三级电影| 日韩久久久久久久久久久久| 九九热精彩视频| 国产日韩欧美一区二区三区综合| 久久久久久久久久网站| 九色蝌蚪在线视频| 国产精品久久久久久69| 男人天堂手机在线视频| 在线成人一区二区| 欧美视频三区在线播放| 亚洲美女区一区| 精品一区二区av| 亚洲国产一区二区三区a毛片| 做a视频在线观看| 岛国av在线| 三级在线观看网站| 精品伦精品一区二区三区视频| 久久精品免费一区二区| 四虎精品欧美一区二区免费| 波兰性xxxxx极品hd| 日韩中文字幕久久久经典网| 超碰在线视屏| 中文字幕伦理免费在线视频| 粉嫩一区二区三区在线观看| 男人操女人的视频在线观看欧美| 欧美激情视频一区二区三区免费| 国产美女视频免费观看下载软件| 三级视频网站在线| 1000部精品久久久久久久久| 色成年激情久久综合| 先锋影音网一区| 久久久久久久久久综合| 成人欧美一区二区三区黑人一| 欧美一卡二卡三卡| 精品高清久久| 欧美另类网站| 免费一区二区三区在在线视频| 亚洲欧美日韩一区在线观看| 99国产视频在线| 亚洲国产精华液网站w| 国产午夜精品久久久久久久久| 91青青草视频| 91国产视频在线播放| 不许穿内裤随时挨c调教h苏绵| 天天干在线影院| 亚洲视频在线免费观看| 一个色综合导航| 影音先锋2020色资源网| 青娱乐国产在线视频| 天天爽夜夜爽夜夜爽| 亚洲综合在线网| 四虎精品在永久在线观看| 精品一区二区在线观看视频| 亚洲男女性事视频| 无码内射中文字幕岛国片| 国产农村妇女精品一区二区| 欧美日韩免费观看一区=区三区| 日本一本视频| 欧美成人家庭影院| 台湾佬中文娱乐网欧美电影| 中文字幕一区在线播放| 97人人澡人人爽91综合色| 国产精品亲子伦av一区二区三区| 午夜欧美一区二区三区免费观看| 丰满大乳少妇在线观看网站| 日韩一区二区精品葵司在线| 欧美天堂一区| 91精品店在线| 欧美a极品极品欧美| 成人在线视频成人| www.男人天堂| 日韩成人精品在线观看| 91精品国产丝袜白色高跟鞋| 日韩女同一区二区三区| 日韩大片欧美大片| 国产精品久久久久一区二区三区共| zztt21.su黑料网站| 天堂va蜜桃一区二区三区| 樱花草在线观看www| 久草在线在线视频| 亚洲日本欧美日韩高观看| h片在线观看视频免费免费| 成年在线播放小视频| 青青草激情视频| 一个人免费观看在线视频www| 日韩脚交footjobhdboots| 成人一区二区三区四区| 欧美精品一级二级三级| 国产剧情av片巨作醉酒女邻居| 日本欧美一区二区三区| 国产一级黄色录像片| 久久99蜜桃精品久久久久小说| 欧美军同video69视频| 亚洲av无码久久精品色欲| 国产精品成人免费一区二区视频| 日韩欧美一级大片| 亚洲二区免费| 波多野结衣中文字幕一区| 日韩精品视频中文在线观看| 日韩伦理精品| 五月天综合激情| 欧美日韩国产亚洲一区| 日本孕妇大胆孕交无码| 久久久久久一区二区| 超碰福利在线观看| 国产丝袜不卡| 四虎国产精品永久在线国在线| 国产黄色大片网站| 国产精品久久久久9999高清| 国产高清视频一区| 一区二区在线观看av| 日本在线视频一区二区| 四季久久免费一区二区三区四区| 国产精品久久久免费看| 精品嫩草影院久久| 九九热线有精品视频99| 中国女人内谢69xxx视频| 337人体粉嫩噜噜噜| 欧美日韩国产123区| 国产精品一区二区中文字幕| 男人天堂新地址| 欧美亚洲高清一区二区三区不卡| 制服丝袜综合日韩欧美| 亚洲av成人精品日韩在线播放| 男人天堂综合| 国产福利视频网站| 亚洲高清视频在线观看| 久久久久国产精品区片区无码| 久久高清无码视频| 国产黄色av网站| 一区二区三区四区在线观看国产日韩| 鲁大师成人一区二区三区| 99国产在线观看| 国产日韩欧美一区二区三区四区| 久久久精品网| 蓝色福利精品导航|