精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

PHP內核探索之PHP中的哈希表

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

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

筆者github上有一個簡易版的HashTable的實現:HashTable實現

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

HashTable的介紹

哈希表是實現字典操作的一種有效數據結構。

定義

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

實現哈希表的關鍵

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

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

因此,實現一個好的哈希表的關鍵就是一個好的哈希函數和處理哈希沖突的方法。

Hash函數

判斷一個哈希算法的好壞有以下四個定義: > * 一致性,等價的鍵必然產生相等的哈希值; > * 高效性,計算簡便; > * 均勻性,均勻地對所有的鍵進行哈希。

哈希函數建立了關鍵值與哈希值的對應關系,即:h = hash_func(key)。對應關系見下圖:

hash-exam

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

 

  1. static inline ulong zend_inline_hash_func(const char *arKey, uint nKeyLength) 
  2.          register ulong hash = 5381
  3.  
  4.         /* variant with the hash unrolled eight times */ 
  5.         for (; nKeyLength >= 8; nKeyLength -= 8) { 
  6.             hash = ((hash << 5) + hash) + *arKey++; 
  7.             hash = ((hash << 5) + hash) + *arKey++; 
  8.             hash = ((hash << 5) + hash) + *arKey++; 
  9.             hash = ((hash << 5) + hash) + *arKey++; 
  10.             hash = ((hash << 5) + hash) + *arKey++; 
  11.             hash = ((hash << 5) + hash) + *arKey++; 
  12.             hash = ((hash << 5) + hash) + *arKey++; 
  13.             hash = ((hash << 5) + hash) + *arKey++; 
  14.     } 
  15.  
  16.     switch (nKeyLength) { 
  17.         case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ 
  18.         case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ 
  19.         case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ 
  20.         case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ 
  21.         case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ 
  22.         case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ 
  23.         case 1: hash = ((hash << 5) + hash) + *arKey++; break
  24.         case 0break
  25.         EMPTY_SWITCH_DEFAULT_CASE() 
  26.     } 
  27.     return hash; 

 

注:函數使用了一個8次循環+switch來實現,是對for循環的優化,減少循環的運行次數,然后在switch里面執行剩下的沒有遍歷到的元素。

拉鏈法

將所有具有相同哈希值的元素都保存在一條鏈表中的方法叫拉鏈法。查找的時候通過先計算key對應的哈希值,然后根據哈希值找到對應的鏈表,最后沿著鏈表順序查找相應的值。 具體保存后的結構圖如下:

hashtable-exam

PHP的HashTable結構

簡單地介紹了哈希表的數據結構之后,繼續看看PHP中是如何實現哈希表的。

 

  1. typedef struct _hashtable { 
  2.           uint nTableSize; 
  3.           uint nTableMask; 
  4.           uint nNumOfElements; 
  5.           ulong nNextFreeElement; 
  6.           Bucket *pInternalPointer; 
  7.           Bucket *pListHead; 
  8.           Bucket *pListTail;  
  9.           Bucket **arBuckets; 
  10.           dtor_func_t pDestructor; 
  11.           zend_bool persistent; 
  12.           unsigned char nApplyCount; 
  13.           zend_bool bApplyProtection; 
  14.           #if ZEND_DEBUG 
  15.                int inconsistent; 
  16.           #endif 
  17. } HashTable; 

 

  • nTableSize,HashTable的大小,以2的倍數增長

  • nTableMask,用在與哈希值做與運算獲得該哈希值的索引取值,arBuckets初始化后永遠是nTableSize-1

  • nNumOfElements,HashTable當前擁有的元素個數,count函數直接返回這個值

  • nNextFreeElement,表示數字鍵值數組中下一個數字索引的位置

  • pInternalPointer,內部指針,指向當前成員,用于遍歷元素

  • pListHead,指向HashTable的第一個元素,也是數組的第一個元素

  • pListTail,指向HashTable的最后一個元素,也是數組的最后一個元素。與上面的指針結合,在遍歷數組時非常方便,比如reset和endAPI

  • arBuckets,包含bucket組成的雙向鏈表的數組,索引用key的哈希值和nTableMask做與運算生成

  • pDestructor,刪除哈希表中的元素使用的析構函數

  • persistent,標識內存分配函數,如果是TRUE,則使用操作系統本身的內存分配函數,否則使用PHP的內存分配函數

  • nApplyCount,保存當前bucket被遞歸訪問的次數,防止多次遞歸

  • bApplyProtection,標識哈希表是否要使用遞歸保護,默認是1,要使用

舉一個哈希與mask結合的例子:

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

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

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

bucket結構體的定義

 

  1. typedef struct bucket { 
  2.      ulong h; 
  3.      uint nKeyLength; 
  4.      void *pData; 
  5.      void *pDataPtr; 
  6.      struct bucket *pListNext; 
  7.      struct bucket *pListLast; 
  8.      struct bucket *pNext; 
  9.      struct bucket *pLast; 
  10.      const char *arKey; 
  11. } Bucket; 
  • h,哈希值(或數字鍵值的key

  • nKeyLength,key的長度

  • pData,指向數據的指針

  • pDataPtr,指針數據

  • pListNext,指向HashTable中的arBuckets鏈表中的下一個元素

  • pListLast,指向HashTable中的arBuckets鏈表中的上一個元素

  • pNext,指向具有相同hash值的bucket鏈表中的下一個元素

  • pLast,指向具有相同hash值的bucket鏈表中的上一個元素

  • arKey,key的名稱

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

一個PHP中的HashTable的示例圖如下所示:

php-hash-table-exam

HashTable相關API

  • zend_hash_init

  • zend_hash_add_or_update

  • zend_hash_find

  • zend_hash_del_key_or_index

zend_hash_init

函數執行步驟

  • 設置哈希表大小

  • 設置結構體其他成員變量的初始值 (包括釋放內存用的析構函數pDescructor)

詳細代碼注解點擊:zend_hash_init源碼

注:

1、pHashFunction在此處并沒有用到,php的哈希函數使用的是內部的zend_inline_hash_func

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

zend_hash_add_or_update

函數執行步驟

  • 檢查鍵的長度

  • 檢查初始化

  • 計算哈希值和下標

  • 遍歷哈希值所在的bucket,如果找到相同的key且值需要更新,則更新數據,否則繼續指向bucket的下一個元素,直到指向bucket的最后一個位置

  • 為新加入的元素分配bucket,設置新的bucket的屬性值,然后添加到哈希表中

  • 如果哈希表空間滿了,則重新調整哈希表的大小

函數執行流程圖

zend_hash_add_or_update

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

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

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

zend_hash_find

函數執行步驟

  • 計算哈希值和下標

  • 遍歷哈希值所在的bucket,如果找到key所在的bucket,則返回值,否則,指向下一個bucket,直到指向bucket鏈表中的最后一個位置

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

zend_hash_del_key_or_index

函數執行步驟

  • 計算key的哈希值和下標

  • 遍歷哈希值所在的bucket,如果找到key所在的bucket,則進行第三步,否則,指向下一個bucket,直到指向bucket鏈表中的最后一個位置

  • 如果要刪除的是第一個元素,直接將arBucket[nIndex]指向第二個元素;其余的操作是將當前指針的last的next執行當前的next

  • 調整相關指針

  • 釋放數據內存和bucket結構體內存

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

性能分析

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

不足如下:

  • 保存數據的結構體zval需要單獨分配內存,需要管理這個額外的內存,每個zval占用了16bytes的內存;

  • 在新增bucket時,bucket也是額外分配,也需要16bytes的內存;

  • 為了能進行順序遍歷,使用雙向鏈表連接整個HashTable,多出了很多的指針,每個指針也要16bytes的內存;

  • 在遍歷時,如果元素位于bucket鏈表的尾部,也需要遍歷完整個bucket鏈表才能找到所要查找的值

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

后續

上面提到的不足,在PHP7中都很好地解決了,PHP7對內核中的數據結構做了一個大改造,使得PHP的效率高了很多,因此,推薦PHP開發者都將開發和部署版本更新吧。看看下面這段PHP代碼:

 

  1. <?php 
  2. $size = pow(216);  
  3.  
  4. $startTime = microtime(true); 
  5. $array = array(); 
  6. for ($key = 0, $maxKey = ($size - 1) * $size; $key <= $maxKey; $key += $size) { 
  7.     $array[$key] = 0
  8. $endTime = microtime(true); 
  9. echo '插入 ', $size, ' 個惡意的元素需要 ', $endTime - $startTime, ' 秒'"\n"
  10.  
  11. $startTime = microtime(true); 
  12. $array = array(); 
  13. for ($key = 0, $maxKey = $size - 1; $key <= $maxKey; ++$key) { 
  14.     $array[$key] = 0
  15. $endTime = microtime(true); 
  16. echo '插入 ', $size, ' 個普通元素需要 ', $endTime - $startTime, ' 秒'"\n"

 

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

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

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

而在PHP7上運行的結果:

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

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

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

參考文章:

PHP數組的Hash沖突實例

Understanding PHP’s internal array implementation (PHP’s Source Code for PHP Developers – Part 4)

PHP’s new hashtable implementation

責任編輯:張燕妮 來源: 碼農網
相關推薦

2017-07-27 14:21:40

phpPHP源碼分析hashtable

2017-07-19 16:58:53

PHPFastCGI 內核探索

2017-06-01 10:44:29

2011-07-04 14:57:56

PHP

2011-07-04 14:33:07

PHP

2011-07-12 17:06:43

PHP

2011-07-14 15:05:54

PHP

2011-07-05 17:52:41

PHP

2010-11-24 13:58:11

mysql表

2011-07-05 17:45:07

PHP框架

2015-10-12 09:13:02

PHPFastCGI mod_php

2011-12-02 08:51:19

PHP

2017-03-01 20:08:36

PHP內核分析

2010-11-24 10:05:20

mysql創建臨時表

2014-11-11 15:25:30

PHPWeb

2017-02-27 16:22:52

2011-03-21 11:16:51

LAMPPHP

2011-07-19 11:12:36

PHPMySQL數據庫

2011-07-07 13:48:35

Smarty

2011-05-11 17:40:30

PHP正則表達式
點贊
收藏

51CTO技術棧公眾號

动漫3d精品一区二区三区乱码| 欧美孕妇性xxxⅹ精品hd| 亚洲国产精品久久久久蝴蝶传媒| 日韩欧美亚洲国产另类 | 九一精品国产| 欧美日韩一区二区三区免费看| www.黄色网址.com| 天天干在线观看| 美腿丝袜在线亚洲一区| 日本一区二区成人| 成人在线播放av| 欧美福利视频一区二区| 999精品视频| 在线观看亚洲精品| 日本大胆人体视频| 国产精品影院在线| 国产精品毛片在线| 精品国产一区二区亚洲人成毛片| 久久美女福利视频| 午夜小视频免费| 黄色小说综合网站| 日本精品一区二区三区在线播放视频| 中文字幕在线观看2018| 日本电影久久久| 午夜av一区二区三区| 亚洲自拍偷拍二区| 美州a亚洲一视本频v色道| 国产精一品亚洲二区在线视频| 国产精欧美一区二区三区| 久久久久噜噜噜亚洲熟女综合| 欧美熟乱15p| 日韩高清中文字幕| 最好看的中文字幕| 国产精品美女久久久久人| 欧美性大战久久久久久久| 成年人午夜视频在线观看| 最爽无遮挡行房视频在线| 国产精品国产自产拍高清av| 免费久久久一本精品久久区| 亚洲色欧美另类| 成人免费观看男女羞羞视频| 97视频在线观看免费高清完整版在线观看| 免费黄色国产视频| 欧美理论在线播放| 国产亚洲欧美视频| 99视频在线视频| 乡村艳史在线观看| 婷婷丁香久久五月婷婷| 韩日视频在线观看| 黄页网站在线观看免费| 亚洲精品成人在线| 国产在线精品二区| 人妻一区二区三区| 成人午夜激情视频| 99porn视频在线| 国产夫绿帽单男3p精品视频| 国产激情一区二区三区四区| 亚洲一区中文字幕| 午夜精品久久久久久久99热黄桃 | 亚洲中文字幕无码一区二区三区| 在线免费黄色| 国产精品电影院| 中国一级黄色录像| 影院在线观看全集免费观看| 亚洲精品成人少妇| 成人精品视频在线播放| 国产免费拔擦拔擦8x高清在线人| 疯狂蹂躏欧美一区二区精品| 天堂精品一区二区三区| 91在线视频国产| 99日韩精品| 日本久久久久久久久| 久久精品久久久久久久| 欧美日本二区| 午夜精品久久17c| 最新中文字幕一区| 日韩电影在线观看网站| 成人免费大片黄在线播放| 国产www视频| 91亚洲精品一区二区乱码| 任我爽在线视频精品一| 欧美69xxx| 亚洲视频在线一区| 国产一区二区网| 亚洲不卡系列| 日韩一级片网址| 在线免费观看污视频| 国产成人一区| 欧美精品一区二区免费| 国产精品黄色大片| 日本在线播放一区二区三区| 91在线高清视频| 午夜视频福利在线| 中文字幕欧美一| 日韩小视频在线播放| 国产精品毛片久久久久久久久久99999999 | 日韩中文字幕av在线| 菠萝菠萝蜜在线视频免费观看| 午夜激情综合网| 91av视频免费观看| 老牛精品亚洲成av人片| www.日韩av.com| 可以免费看的av毛片| 激情综合网最新| 日本一区二区在线视频| 国产网友自拍视频导航网站在线观看| 99久久婷婷国产综合精品电影| 色综合影院在线观看| 日本大片在线播放| 欧美午夜视频网站| 国产精品福利导航| 欧美日韩亚洲一区二区三区在线| 国产精品video| 欧美一区二区黄片| 1000部国产精品成人观看| 精品久久久久久久免费人妻| 看亚洲a级一级毛片| 一夜七次郎国产精品亚洲| 欧美一级高潮片| 国产一区二区在线电影| 日韩精品极品视频在线观看免费| 18video性欧美19sex高清| 欧美日本在线播放| 国产精品久久久久无码av色戒| 欧美日韩专区| 91久久久久久久久久| www视频在线观看免费| 黑人巨大精品欧美一区二区| 精品人妻在线视频| 欧美福利视频| 91精品免费视频| 在线观看的av| 91成人免费在线视频| 青青草视频成人| 亚洲美女色禁图| 99三级在线| а√中文在线8| 欧美一三区三区四区免费在线看| 97精品在线播放| 美女国产一区二区三区| 日本一区二区视频| 先锋欧美三级| 国产亚洲人成网站在线观看| 成人公开免费视频| 国产无一区二区| 香蕉视频网站入口| 欧美精选一区二区三区| 国产精品日韩电影| av男人的天堂在线| 欧美无人高清视频在线观看| 人妻少妇无码精品视频区| 久久久一二三| 亚洲高清视频一区| 成人影院在线免费观看| 中文字幕日韩精品在线| 最新国产中文字幕| 国产精品视频麻豆| 亚洲一级片av| 欧美区国产区| 久久综合久久综合这里只有精品| 日韩电影毛片| 在线日韩av观看| 中文字幕乱码人妻二区三区| 国产精品久久久久久久久久免费看 | 正在播放亚洲一区| 欧美日韩三级在线观看| www.成人在线| 免费看国产黄色片| 性xxxx欧美老肥妇牲乱| 成人在线看片| 日本不卡1234视频| 这里只有视频精品| a视频免费在线观看| 午夜精品福利一区二区三区av| 国产精品揄拍100视频| 秋霞午夜av一区二区三区| 亚洲免费av网| 免费成人三级| 国产精品丝袜久久久久久不卡| 毛片免费不卡| 日韩av中文字幕在线免费观看| 国产主播第一页| 亚洲激情网站免费观看| 久久久久麻豆v国产精华液好用吗| 首页综合国产亚洲丝袜| www.黄色网址.com| 欧美禁忌电影网| 91免费版黄色| 在线日本欧美| 久久人人爽人人爽人人片av高请| 狠狠狠综合7777久夜色撩人| 日韩片之四级片| 黄色片中文字幕| 一区二区三区在线免费视频| 无码人妻精品一区二区三区温州 | 大片免费播放在线视频| 精品国产麻豆免费人成网站| 成人一二三四区| 亚洲国产综合视频在线观看| 欧洲性xxxx| 91在线视频播放地址| 亚洲自拍第三页| 日韩精品视频网| 日韩精品一区在线视频| 91九色精品国产一区二区| 蜜桃av噜噜一区二区三| 久久gogo国模啪啪裸体| 国产精品免费久久久| 成人影院在线视频| 成人444kkkk在线观看| 国产高清免费av在线| 国产视频丨精品|在线观看| 国产婷婷在线视频| 欧美日韩美少妇| 精品人妻无码一区二区性色 | 色av性av丰满av| 亚洲一区二区三区免费视频| 女人18毛片毛片毛片毛片区二| 国产亚洲精品福利| 亚洲 欧美 日韩在线| 亚洲综合婷婷| 2020国产精品久久精品不卡| 亚洲成人短视频| 91精品国产高清久久久久久91 | 欧美精品videos| 久cao在线| 国产亚洲精品久久久久动| 天堂在线资源网| 精品国精品自拍自在线| 精品国产亚洲av麻豆| 欧美精品在欧美一区二区少妇 | 日韩女优av电影| 一级黄色大片免费观看| 色婷婷综合久久| 国产免费av一区| 都市激情亚洲色图| 在线能看的av| 欧美日韩亚洲一区二区三区| 全部毛片永久免费看| 亚洲成av人片| 日韩乱码人妻无码中文字幕| 午夜婷婷国产麻豆精品| 国产精品16p| 亚洲h动漫在线| 日韩欧美性视频| 精品国产福利视频| 中文字幕亚洲精品一区| 日韩欧美高清视频| 久久精品视频5| 色吊一区二区三区| 小泽玛利亚一区二区三区视频| 欧美伊人久久大香线蕉综合69 | 久久久.www| 亚洲一二三四在线| 日韩精品一区三区| 欧美日韩亚洲国产一区 | 制服丝袜亚洲色图| 国产精品久久免费| 日韩视频一区在线观看| 蜜桃视频污在线观看| 日韩高清不卡av| av男人的天堂在线| 久热精品视频在线| 啪啪免费视频一区| 欧美在线播放视频| 久久久国产精品网站| 91丨九色丨国产| 同性恋视频一区| 亚洲三区在线| 国产一区美女| 无码无遮挡又大又爽又黄的视频| 美女一区二区三区| 香蕉视频色在线观看| 欧美综合二区| 性刺激的欧美三级视频| 国产一区二区精品久久91| 免费观看一区二区三区| 91丨porny丨国产入口| 免费一级特黄3大片视频| 亚洲欧洲成人精品av97| 日韩福利片在线观看| 欧美色大人视频| 成人免费公开视频| 国产亚洲精品美女| 日本片在线看| 久久久精品亚洲| av最新在线| 国产欧美日韩免费| 国产精品视屏| 艳色歌舞团一区二区三区| 在线成人av| 99久久久精品视频| 久久久成人网| 一级黄色大片免费看| 国产日韩av一区| 精品少妇一二三区| 欧美视频中文字幕| 特级丰满少妇一级aaaa爱毛片| 日韩在线视频一区| 美女视频在线免费| 91在线直播亚洲| 精品日本12videosex| 男人天堂av片| 久久se精品一区精品二区| 亚洲男人在线天堂| 亚洲乱码国产乱码精品精的特点| 懂色av蜜臀av粉嫩av分享吧最新章节| 欧美一二三在线| av基地在线| 日韩av免费在线观看| 老牛精品亚洲成av人片| 青青草原网站在线观看| 蜜桃视频一区二区三区在线观看 | 国产精品毛片一区视频播| 亚洲美女性视频| 黄色污污视频在线观看| 成人免费视频网| 日本不卡免费一区| 欧美少妇性生活视频| www.欧美色图| 日韩经典在线观看| 日韩片之四级片| 97超碰在线公开在线看免费| 国产欧美日韩高清| 精品久久久久中文字幕小说 | 亚洲精品一区二区三| 午夜一级久久| 午夜久久久久久久| 午夜精彩视频在线观看不卡| 六月丁香综合网| 欧美精品videossex88| gogo久久日韩裸体艺术| 日韩欧美视频免费在线观看| 国产乱码精品一区二区三区忘忧草 | 又色又爽又高潮免费视频国产| 99精品国产99久久久久久白柏| 国产情侣在线视频| 亚洲国产另类 国产精品国产免费| 毛片大全在线观看| 粉嫩av四季av绯色av第一区| 欧美区一区二| 亚洲啪av永久无码精品放毛片| 亚洲一区二三区| 日韩中文字幕综合| 亚州国产精品久久久| 欧美激情15p| 黄色一级一级片| 中文字幕巨乱亚洲| 在线观看一二三区| 久色乳综合思思在线视频| 国产95亚洲| 成人毛片100部免费看| 高清不卡一区二区| 少妇一级淫片免费放中国| 亚洲美女久久久| 日日狠狠久久| 狠狠干视频网站| 99视频一区二区| 中文字幕在线欧美| 中文字幕一区二区三区电影| 粉嫩一区二区三区在线观看| 无码熟妇人妻av在线电影| av资源站一区| 波多野结衣一区二区在线| 日韩在线视频导航| swag国产精品一区二区| 黄色av网址在线播放| 欧美国产精品久久| 国产精品国产av| 国内免费精品永久在线视频| 亚洲精品aaaaa| 亚洲一区二区在线视频观看| 夜夜亚洲天天久久| 人成免费电影一二三区在线观看| 国产精品伦子伦免费视频| 亚洲影视一区| 一二三不卡视频| 欧美最猛性xxxx| 日本三级在线观看网站| 久久99精品久久久久久青青日本 | 丝袜美腿诱惑一区二区三区| 一本一本久久a久久精品综合妖精| 国产精选一区二区三区| 国产微拍精品一区| 少妇高潮久久久久久潘金莲| 91精品啪在线观看国产手机| 黄色片久久久久| 亚洲靠逼com| 欧洲综合视频| 69堂成人精品视频免费| 久久亚洲国产精品一区二区| 91成人福利视频| 伊人伊成久久人综合网小说| 亚洲一区二区免费在线观看| 欧美日韩在线观看不卡| 夜夜嗨av一区二区三区| 成人免费在线观看| 精品国产福利| 国产一区二区三区av电影| aaa在线视频|