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

簡(jiǎn)單高效的短鏈接生成服務(wù)C#實(shí)現(xiàn)

開發(fā) 后端
項(xiàng)目中有一處需求,需要把長(zhǎng)網(wǎng)址縮為短網(wǎng)址,把結(jié)果通過(guò)短信、微信等渠道推送給客戶。剛開始直接使用網(wǎng)上現(xiàn)成的開放服務(wù),然后在某個(gè)周末突然手癢想自己動(dòng)手實(shí)現(xiàn)一個(gè)別具特色的長(zhǎng)網(wǎng)址(文本)縮短服務(wù)。

項(xiàng)目中有一處需求,需要把長(zhǎng)網(wǎng)址縮為短網(wǎng)址,把結(jié)果通過(guò)短信、微信等渠道推送給客戶。剛開始直接使用網(wǎng)上現(xiàn)成的開放服務(wù),然后在某個(gè)周末突然手癢想自己動(dòng)手實(shí)現(xiàn)一個(gè)別具特色的長(zhǎng)網(wǎng)址(文本)縮短服務(wù)。

由于以前做過(guò)socket服務(wù),對(duì)數(shù)據(jù)包的封裝排列還有些印象,因此,短網(wǎng)址服務(wù)我第一反應(yīng)是先設(shè)計(jì)數(shù)據(jù)的存儲(chǔ)格式,我這里沒(méi)有采用數(shù)據(jù)庫(kù),而是使用2個(gè)文件來(lái)實(shí)現(xiàn):

Url.db存儲(chǔ)用戶提交的長(zhǎng)網(wǎng)址文本,Url.idx 存儲(chǔ)數(shù)據(jù)索引,記錄每次提交數(shù)據(jù)的位置(Begin)與長(zhǎng)度(Length),還有一些附帶信息(Hits,DateTime)。由于每次添加長(zhǎng)網(wǎng)址,對(duì) 兩個(gè)文件都是進(jìn)行Append操作,因此即使這兩個(gè)文件體積很大(比如若干GB),也沒(méi)有太大的IO壓力。

再看看Url.idx文件的結(jié)構(gòu),ID是主鍵,設(shè)為Int64類型,轉(zhuǎn)換為字節(jié)數(shù)組后的長(zhǎng)度為8,緊跟的是Begin,該值是把長(zhǎng)網(wǎng)址數(shù)據(jù)續(xù)寫到 Url.db文件之前,Url.db文件的長(zhǎng)度,同樣設(shè)為Int64類型。長(zhǎng)網(wǎng)址的字符串長(zhǎng)度有限,Int16足夠使用 了,Int16.MaxValue==65536,比Url規(guī)范定義的4Kb長(zhǎng)度還大,Int16轉(zhuǎn)換為字節(jié)數(shù)組后長(zhǎng)度為2字節(jié)。Hits表示短網(wǎng)址的解 析次數(shù),設(shè)為Int32,字節(jié)長(zhǎng)度為4,DateTime 設(shè)為Int64,長(zhǎng)度8。由于ID不會(huì)像數(shù)據(jù)庫(kù)那樣自動(dòng)遞增,因此需要手工實(shí)現(xiàn)。因此在開始寫入U(xiǎn)rl.idx前,需要預(yù)先讀取最后一行(行是虛的,其實(shí) 就是最后30字節(jié))中的的ID值,遞增后才開始寫入新的一行。

也就是說(shuō)每次提交一個(gè)長(zhǎng)網(wǎng)址,不管數(shù)據(jù)有多長(zhǎng)(最大不能超過(guò)65536字節(jié)),Url.idx 文件都固定增加 30 字節(jié)。

數(shù)據(jù)結(jié)構(gòu)一旦明確下來(lái),整個(gè)網(wǎng)址縮短服務(wù)就變得簡(jiǎn)單明了。例如連續(xù)兩次提交長(zhǎng)網(wǎng)址,可能得到的短網(wǎng)址為http://域名/1000,與http://域名/1001,結(jié)果顯然很丑陋,域名后面的ID全是數(shù)字,而且遞增關(guān)系明顯,很容易暴力枚舉全部的數(shù)據(jù)。而且10進(jìn)制的數(shù)字容量有限,一次提交100萬(wàn)條的長(zhǎng)網(wǎng)址,產(chǎn)生的短網(wǎng)址越來(lái)越長(zhǎng),失去意義。

因此下面就開始對(duì)ID進(jìn)行改造,改造的目標(biāo)有2:

1、增加混淆機(jī)制,相鄰兩個(gè)ID表面上看不出區(qū)別。

2、增加容量,一次性提交100萬(wàn)條長(zhǎng)網(wǎng)址,ID的長(zhǎng)度不能有明顯變化。

最簡(jiǎn)單最直接的混淆機(jī)制,就是把10進(jìn)制轉(zhuǎn)換為62進(jìn)制(0-9a-zA-Z),由于順序的abcdef…也很容易猜到下一個(gè)ID,因此62進(jìn)制字符序列隨機(jī)排列一次:

/// <summary>
    /// 生成隨機(jī)的0-9a-zA-Z字符串
    /// </summary>
    /// <returns></returns>
    public static string GenerateKeys()
    {
        string[] Chars = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z".Split(',');
        int SeekSeek = unchecked((int)DateTime.Now.Ticks);
        Random SeekRand = new Random(SeekSeek);
        for (int i = 0; i < 100000; i++)
        {
            int r = SeekRand.Next(1, Chars.Length);
            string f = Chars[0];
            Chars[0] = Chars[r - 1];
            Chars[r - 1] = f;
        }
        return string.Join("", Chars);
    }

運(yùn)行一次上面的方法,得到隨機(jī)序列:

string Seq = "s9LFkgy5RovixI1aOf8UhdY3r4DMplQZJXPqebE0WSjBn7wVzmN2Gc6THCAKut";

用這個(gè)序列字符串替代0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,具有很強(qiáng)的混淆特性。一個(gè)10進(jìn)制的數(shù)字按上面的序列轉(zhuǎn)換為62進(jìn)制,將變得面目全非,附轉(zhuǎn)換方法:

/// <summary>
    /// 10進(jìn)制轉(zhuǎn)換為62進(jìn)制
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    private static string Convert(long id)
    {
        if (id < 62)
        {
            return Seq[(int)id].ToString();
        }
        int y = (int)(id % 62);
        long x = (long)(id / 62);

        return Convert(x) + Seq[y];
    }

    /// <summary>
    /// 將62進(jìn)制轉(zhuǎn)為10進(jìn)制
    /// </summary>
    /// <param name="Num"></param>
    /// <returns></returns>
    private static long Convert(string Num)
    {
        long v = 0;
        int Len = Num.Length;
        for (int i = Len - 1; i >= 0; i--)
        {
            int t = Seq.IndexOf(Num[i]);
            double s = (Len - i) - 1;
            long m = (long)(Math.Pow(62, s) * t);
            v += m;
        }
        return v;
    }

例如執(zhí)行 Convert(123456789) 得到 RYswX,執(zhí)行 Convert(123456790) 得到 RYswP。

如果通過(guò)分析大量的連續(xù)數(shù)值,還是可以暴力算出上面的Seq序列值,進(jìn)而猜測(cè)到某個(gè)ID左右兩邊的數(shù)值。下面進(jìn)一步強(qiáng)化混淆,ID每次遞增的單位不是固定的1,而是一個(gè)隨機(jī)值,比如1000,1005,1013,1014,1020,毫無(wú)規(guī)律可言。

private static Int16 GetRnd(Random seekRand)
    {
        Int16 s = (Int16)seekRand.Next(1, 11);
        return s;
    }

即使把62進(jìn)制的值逆向計(jì)算出10進(jìn)制的ID值,也難于猜測(cè)到左右兩邊的值,大大增加暴力枚舉的難度。難度雖然增加,但是連續(xù)產(chǎn)生的2個(gè)62進(jìn)制值 如前面的RyswX與RyswP,僅個(gè)位數(shù)不同,還是很像,因此我們?cè)龠M(jìn)行第三次簡(jiǎn)單的混淆,把62進(jìn)制字符向左(右)旋轉(zhuǎn)一定次數(shù)(解析時(shí)反向旋轉(zhuǎn)同樣 的次數(shù)):

/// <summary>
    /// 混淆id為字符串
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    private static string Mixup(long id)
    {
        string Key = Convert(id);
        int s = 0;
        foreach (char c in Key)
        {
            s += (int)c;
        }
        int Len = Key.Length;
        int x = (s % Len);
        char[] arr = Key.ToCharArray();
        char[] newarr = new char[arr.Length];
        Array.Copy(arr, x, newarr, 0, Len - x);
        Array.Copy(arr, 0, newarr, Len - x, x);
        string NewKey = "";
        foreach (char c in newarr)
        {
            NewKey += c;
        }
        return NewKey;
    }

    /// <summary>
    /// 解開混淆字符串
    /// </summary>
    /// <param name="Key"></param>
    /// <returns></returns>
    private static long UnMixup(string Key)
    {
        int s = 0;
        foreach (char c in Key)
        {
            s += (int)c;
        }
        int Len = Key.Length;
        int x = (s % Len);
        x = Len - x;
        char[] arr = Key.ToCharArray();
        char[] newarr = new char[arr.Length];
        Array.Copy(arr, x, newarr, 0, Len - x);
        Array.Copy(arr, 0, newarr, Len - x, x);
        string NewKey = "";
        foreach (char c in newarr)
        {
            NewKey += c;
        }
        return Convert(NewKey);
    }

執(zhí)行 Mixup(123456789)得到wXRYs,假如隨機(jī)遞增值為7,則下一條記錄的ID執(zhí)行 Mixup(123456796)得到swWRY,肉眼上很難再聯(lián)想到這兩個(gè)ID值是相鄰的。

以上講述了數(shù)據(jù)結(jié)構(gòu)與ID的混淆機(jī)制,下面講述的是短網(wǎng)址的解析機(jī)制。

得到了短網(wǎng)址,如wXRYs,我們可以通過(guò)上面提供的UnMixup()方法,逆向計(jì)算出ID值,由于ID不是遞增步長(zhǎng)為1的數(shù)字,因此不能根據(jù)ID馬上計(jì)算出記錄在索引文件中的位置(如:ID * 30)。由于ID是按小到大的順序排列,因此在索引文件中定位ID,非二分查找法莫屬。

//二分法查找的核心代碼片段
FileStream Index = new FileStream(IndexFile, FileMode.OpenOrCreate, FileAccess.ReadWrite);
            long Id =;//解析短網(wǎng)址得到的真實(shí)ID
            long Left = 0;
            long Right = (long)(Index.Length / 30) - 1;
            long Middle = -1;           
            while (Left <= Right)
            {
                Middle = (long)(Math.Floor((double)((Right + Left) / 2)));
                if (Middle < 0) break;
                Index.Position = Middle * 30;
                Index.Read(buff, 0, 8);
                long val = BitConverter.ToInt64(buff, 0);
                if (val == Id) break;               
                if (val < Id)
                {
                    Left = Middle + 1;
                }
                else
                {
                    Right = Middle - 1;
                }
            }      

Index.Close();

二分法查找的核心是不斷移動(dòng)指針,讀取中間的8字節(jié),轉(zhuǎn)換為數(shù)字后再與目標(biāo)ID比較的過(guò)程。這是一個(gè)非常高速的算法,如果有接近43億條短網(wǎng)址記 錄,查找某一個(gè)ID,最多只需要移動(dòng)32次指針(上面的while循環(huán)32次)就能找到結(jié)果,因?yàn)?^32=4294967296。

用二分法查找是因?yàn)榍懊媸褂昧穗S機(jī)遞增步長(zhǎng),如果遞增步長(zhǎng)設(shè)為1,則二分法可免,直接從 ID*30 就能一次性精準(zhǔn)定位到索引文件中的位置。

下面是完整的代碼,封裝了一個(gè)ShortenUrl類:

using System;
using System.Linq;
using System.Web;
using System.IO;
using System.Text;

/// <summary>
/// ShortenUrl 的摘要說(shuō)明
/// </summary>
public class ShortenUrl
{
    const string Seq = "s9LFkgy5RovixI1aOf8UhdY3r4DMplQZJXPqebE0WSjBn7wVzmN2Gc6THCAKut";

    private static string DataFile
    {
        get { return HttpContext.Current.Server.MapPath("/Url.db"); }
    }

    private static string IndexFile
    {
        get { return HttpContext.Current.Server.MapPath("/Url.idx"); }
    }

    /// <summary>
    /// 批量添加網(wǎng)址,按順序返回Key。如果輸入的一組網(wǎng)址中有不合法的元素,則返回?cái)?shù)組的相同位置(下標(biāo))的元素將為null。
    /// </summary>
    /// <param name="Url"></param>   
    /// <returns></returns>
    public static string[] AddUrl(string[] Url)
    {
        FileStream Index = new FileStream(IndexFile, FileMode.OpenOrCreate, FileAccess.ReadWrite);
        FileStream Data = new FileStream(DataFile, FileMode.Append, FileAccess.Write);
        Data.Position = Data.Length;
        DateTime Now = DateTime.Now;
        byte[] dt = BitConverter.GetBytes(Now.ToBinary());
        int _Hits = 0;
        byte[] Hits = BitConverter.GetBytes(_Hits);
        string[] ResultKey = new string[Url.Length];
        int seekSeek = unchecked((int)Now.Ticks);
        Random seekRand = new Random(seekSeek);
        string Host = HttpContext.Current.Request.Url.Host.ToLower();       
        byte[] Status = BitConverter.GetBytes(true);
        //index: ID(8) + Begin(8) + Length(2) + Hits(4) + DateTime(8) = 30
        for (int i = 0; i < Url.Length && i<1000; i++)
        {
            if (Url[i].ToLower().Contains(Host) || Url[i].Length ==0 ||  Url[i].Length > 4096) continue;
            long Begin = Data.Position;           
            byte[] UrlData = Encoding.UTF8.GetBytes(Url[i]);           
            Data.Write(UrlData, 0, UrlData.Length);                       
            byte[] buff = new byte[8];
            long Last;
            if (Index.Length >= 30) //讀取上一條記錄的ID
            {
                Index.Position = Index.Length - 30;
                Index.Read(buff, 0, 8);
                Index.Position += 22;
                Last = BitConverter.ToInt64(buff, 0);
            }
            else
            {
                Last = 1000000; //起步ID,如果太小,生成的短網(wǎng)址會(huì)太短。
                Index.Position = 0;
            }
            long RandKey = Last + (long)GetRnd(seekRand);
            byte[] BeginData = BitConverter.GetBytes(Begin);
            byte[] LengthData = BitConverter.GetBytes((Int16)(UrlData.Length));
            byte[] RandKeyData = BitConverter.GetBytes(RandKey);

            Index.Write(RandKeyData, 0, 8);
            Index.Write(BeginData, 0, 8);
            Index.Write(LengthData, 0, 2);
            Index.Write(Hits, 0, Hits.Length);           
            Index.Write(dt, 0, dt.Length);           
            ResultKey[i] = Mixup(RandKey);
        }
        Data.Close();
        Index.Close();
        return ResultKey;
    }

    /// <summary>
    /// 按順序批量解析Key,返回一組長(zhǎng)網(wǎng)址。
    /// </summary>
    /// <param name="Key"></param>
    /// <returns></returns>
    public static string[] ParseUrl(string[] Key)
    {
        FileStream Index = new FileStream(IndexFile, FileMode.OpenOrCreate, FileAccess.ReadWrite);
        FileStream Data = new FileStream(DataFile, FileMode.Open, FileAccess.Read);       
        byte[] buff = new byte[8];
        long[] Ids = Key.Select(n => UnMixup(n)).ToArray();
        string[] Result = new string[Ids.Length];
        long _Right = (long)(Index.Length / 30) - 1;       
        for (int j = 0; j < Ids.Length; j++)
        {
            long Id = Ids[j];           
            long Left = 0;
            long Right = _Right;
            long Middle = -1;           
            while (Left <= Right)
            {
                Middle = (long)(Math.Floor((double)((Right + Left) / 2)));
                if (Middle < 0) break;
                Index.Position = Middle * 30;
                Index.Read(buff, 0, 8);
                long val = BitConverter.ToInt64(buff, 0);
                if (val == Id) break;               
                if (val < Id)
                {
                    Left = Middle + 1;
                }
                else
                {
                    Right = Middle - 1;
                }
            }           
            string Url = null;
            if (Middle != -1)
            {
                Index.Position = Middle * 30 + 8; //跳過(guò)ID          
                Index.Read(buff, 0, buff.Length);
                long Begin = BitConverter.ToInt64(buff, 0);
                Index.Read(buff, 0, buff.Length);
                Int16 Length = BitConverter.ToInt16(buff, 0);
                byte[] UrlTxt = new byte[Length];
                Data.Position = Begin;
                Data.Read(UrlTxt, 0, UrlTxt.Length);
                int Hits = BitConverter.ToInt32(buff, 2);//跳過(guò)2字節(jié)的Length
                byte[] NewHits = BitConverter.GetBytes(Hits + 1);//解析次數(shù)遞增, 4字節(jié)
                Index.Position -= 6;//指針撤回到Length之后
                Index.Write(NewHits, 0, NewHits.Length);//覆蓋老的Hits
                Url = Encoding.UTF8.GetString(UrlTxt);                      
            }
            Result[j] = Url;
        }       
        Data.Close();
        Index.Close();
        return Result;
    }

    /// <summary>
    /// 混淆id為字符串
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    private static string Mixup(long id)
    {
        string Key = Convert(id);
        int s = 0;
        foreach (char c in Key)
        {
            s += (int)c;
        }
        int Len = Key.Length;
        int x = (s % Len);
        char[] arr = Key.ToCharArray();
        char[] newarr = new char[arr.Length];
        Array.Copy(arr, x, newarr, 0, Len - x);
        Array.Copy(arr, 0, newarr, Len - x, x);
        string NewKey = "";
        foreach (char c in newarr)
        {
            NewKey += c;
        }
        return NewKey;
    }

    /// <summary>
    /// 解開混淆字符串
    /// </summary>
    /// <param name="Key"></param>
    /// <returns></returns>
    private static long UnMixup(string Key)
    {
        int s = 0;
        foreach (char c in Key)
        {
            s += (int)c;
        }
        int Len = Key.Length;
        int x = (s % Len);
        x = Len - x;
        char[] arr = Key.ToCharArray();
        char[] newarr = new char[arr.Length];
        Array.Copy(arr, x, newarr, 0, Len - x);
        Array.Copy(arr, 0, newarr, Len - x, x);
        string NewKey = "";       
        foreach (char c in newarr)
        {
            NewKey += c;
        }
        return Convert(NewKey);
    }

    /// <summary>
    /// 10進(jìn)制轉(zhuǎn)換為62進(jìn)制
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    private static string Convert(long id)
    {
        if (id < 62)
        {
            return Seq[(int)id].ToString();
        }
        int y = (int)(id % 62);
        long x = (long)(id / 62);

        return Convert(x) + Seq[y];
    }

    /// <summary>
    /// 將62進(jìn)制轉(zhuǎn)為10進(jìn)制
    /// </summary>
    /// <param name="Num"></param>
    /// <returns></returns>
    private static long Convert(string Num)
    {
        long v = 0;
        int Len = Num.Length;
        for (int i = Len - 1; i >= 0; i--)
        {
            int t = Seq.IndexOf(Num[i]);
            double s = (Len - i) - 1;
            long m = (long)(Math.Pow(62, s) * t);
            v += m;
        }
        return v;
    }

    /// <summary>
    /// 生成隨機(jī)的0-9a-zA-Z字符串
    /// </summary>
    /// <returns></returns>
    public static string GenerateKeys()
    {
        string[] Chars = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z".Split(',');
        int SeekSeek = unchecked((int)DateTime.Now.Ticks);
        Random SeekRand = new Random(SeekSeek);
        for (int i = 0; i < 100000; i++)
        {
            int r = SeekRand.Next(1, Chars.Length);
            string f = Chars[0];
            Chars[0] = Chars[r - 1];
            Chars[r - 1] = f;
        }
        return string.Join("", Chars);
    }

    /// <summary>
    /// 返回隨機(jī)遞增步長(zhǎng)
    /// </summary>
    /// <param name="SeekRand"></param>
    /// <returns></returns>
    private static Int16 GetRnd(Random SeekRand)
    {
        Int16 Step = (Int16)SeekRand.Next(1, 11);
        return Step;
    }
}

本方案的優(yōu)點(diǎn):

把10進(jìn)制的ID轉(zhuǎn)換為62進(jìn)制的字符,6位數(shù)的62進(jìn)制字符容量為 62^6約為568億,如果每次隨機(jī)遞增值為1~10(取平均值為5),6位字符的容量仍然能容納113.6億條!這個(gè)數(shù)據(jù)已經(jīng)遠(yuǎn)遠(yuǎn)大于一般的數(shù)據(jù)庫(kù)承受 能力。由于每次提交長(zhǎng)網(wǎng)址采用Append方式寫入,因此寫入性能也不會(huì)差。在解析短網(wǎng)址時(shí)由于采用二分法查找,僅移動(dòng)文件指針與讀取8字節(jié)的緩存,性能 上依然非常優(yōu)秀。

缺點(diǎn):在高并發(fā)的情況下,可能會(huì)出現(xiàn)文件打開失敗等IO異常,如果改用單線程的Node.js來(lái)實(shí)現(xiàn),或許可以杜絕這種情況。

 

 

責(zé)任編輯:王雪燕 來(lái)源: 蔡大衛(wèi)
相關(guān)推薦

2021-11-04 09:00:00

JavaSpring BootURL

2009-08-13 10:15:50

C#讀取Excel

2009-09-07 15:27:04

C# MessageB

2009-08-31 17:53:20

C#實(shí)現(xiàn)索引器

2009-09-02 14:33:57

C#類實(shí)現(xiàn)接口

2009-09-08 09:31:54

c# CheckBox

2024-07-22 14:34:20

簡(jiǎn)單工廠模式C#

2009-08-25 01:46:00

C# WINDOWS服

2009-09-02 18:03:19

C#實(shí)現(xiàn)泛型類

2009-08-28 16:19:30

C#實(shí)現(xiàn)修改動(dòng)態(tài)鏈接庫(kù)

2009-08-28 15:19:17

C#實(shí)現(xiàn)縮略圖

2009-09-08 16:01:58

C# ListBox

2025-01-08 10:57:13

2021-06-18 11:17:36

URL數(shù)據(jù)庫(kù)MySQL

2025-05-12 09:05:00

C#Internet連接網(wǎng)絡(luò)

2024-04-10 12:56:00

C#批量插入開發(fā)

2010-06-09 10:20:56

鏈接MySQL數(shù)據(jù)庫(kù)

2011-08-30 12:34:18

Oracle C#Oracle Text

2009-09-17 16:53:15

C#數(shù)組

2009-08-31 18:32:01

C# ListBoxE
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

手机免费看av网站| 99久久er热在这里只有精品15| 久久久www免费人成精品| 中文字幕在线观看日韩| 国产二区不卡| 国产三级精品三级观看| av人人综合网| 国产一区日韩一区| 欧美日韩国产综合视频在线观看| 欧美日韩在线高清| 天堂资源在线播放| 一区二区三区视频免费视频观看网站| 国产日韩精品一区二区三区| 午夜精品一区二区三区av| 91看片破解版| 乱人伦视频在线| 东方欧美亚洲色图在线| 欧美高清在线观看| 国产一级二级av| 在线观看a级片| 国产在线精品一区二区不卡了| 亚洲最新av在线| 波多结衣在线观看| 东凛在线观看| 日韩在线a电影| 亚洲少妇中文在线| 久久久久国产精品熟女影院 | 欧美亚洲精品一区| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | www.xxx亚洲| 超级碰碰不卡在线视频| 成人午夜激情影院| 国产色视频一区| 精品日韩在线视频| 日韩久久99| 亚洲欧洲精品一区二区精品久久久| 国产精品美女无圣光视频| 国产综合精品在线| 素人啪啪色综合| 国产精品久久看| 亚洲一区二区在线| 欧美一级高潮片| 国产精品毛片久久| 欧美大片日本大片免费观看| 99在线免费视频观看| 熟妇高潮一区二区三区| 国产亚洲毛片在线| 亚洲日韩中文字幕在线播放| 中国xxxx性xxxx产国| 亚洲天堂手机| 国产精品人人做人人爽人人添| 精品欧美日韩| 中文在线字幕免费观| 国产精品黑丝在线播放| 尤物yw午夜国产精品视频明星 | 久久久综合激的五月天| 国产成人综合久久| 久久精品亚洲a| 一区二区在线视频观看| 91精品久久久久久久久99蜜臂| 91成人在线视频观看| 亚洲欧美另类一区| 日韩国产在线观看| 国产精品成人一区二区| 农村妇女精品一区二区| 台湾亚洲精品一区二区tv| 欧美午夜精品电影| 五月婷婷之综合激情| 欧美日韩激情电影| 一级中文字幕一区二区| 蜜桃传媒视频第一区入口在线看| 一级片在线观看视频| 亚洲国产高清一区| www.美女亚洲精品| 中文在线永久免费观看| 国产经典一区| 欧美美女一区二区三区| 亚洲 高清 成人 动漫| 国产高清视频在线播放| 国产精品色眯眯| 四虎影院一区二区| 激情视频在线观看免费| 成人在线综合网| 久久riav二区三区| 亚洲精品无amm毛片| 免费在线观看成人| 奇米4444一区二区三区| 麻豆changesxxx国产| 国内精品久久久久久久影视简单| 欧美成人精品福利| 自拍偷拍21p| 亚洲不卡系列| 欧美一区二区不卡视频| 一级黄色特级片| 精品国产一区二区三区性色av| 在线观看欧美黄色| 日本a级片免费观看| 色av手机在线| 亚洲视频免费观看| 亚洲精品在线免费| 久久这里精品| 久久综合色综合88| 永久久久久久| 夜级特黄日本大片_在线| 久久精品亚洲精品国产欧美| 亚洲一区二区精品在线观看| 国产一二在线观看| 亚洲欧美视频在线观看| 国产午夜伦鲁鲁| 91成人app| 91精品国产一区二区人妖| 国产精品麻豆入口| 女仆av观看一区| 亚洲成年人在线| 国产二级一片内射视频播放 | 素人啪啪色综合| 亚洲电影天堂av | 亚洲成人一区| 日韩视频免费在线观看| 人人干人人干人人干| 91久久综合| 成人xxxx视频| 国产白浆在线观看| 国产成人免费视频网站高清观看视频| 91系列在线观看| 午夜精品无码一区二区三区| 成人免费黄色大片| 中文字幕一区二区三区精彩视频 | 成人av在线网址| 国产高清视频在线播放| 欧美视频不卡中文| 欧美三级一级片| 一区二区三区欧洲区| 久久艳片www.17c.com| 日韩在线观看视频一区二区| 免费在线欧美视频| 日韩av在线一区二区三区| 日本免费视频在线观看| 色婷婷av一区二区三区gif | 日产电影一区二区三区| 亚洲国产专区| 91精品国产91久久久久青草| 亚洲精品成人区在线观看| 国产精品不卡在线观看| 香港三级日本三级a视频| 嗯~啊~轻一点视频日本在线观看| 精品久久香蕉国产线看观看gif| 欧美 国产 日本| 麻豆视频一区| www.国产精品一二区| 成年人晚上看的视频| 国产在线视频一区二区| 日本黄色播放器| av日韩在线免费观看| 久久婷婷国产麻豆91天堂| 国产一区二区麻豆| 中文字幕在线观看不卡| 在线免费看v片| 天天做夜夜做人人爱精品| 午夜免费久久久久| 性一交一乱一伧老太| 亚洲午夜在线视频| 久久久久久久久久久久91| heyzo久久| 久久久久久久一区二区三区| 中文字幕在线观看免费| 中文字幕第一区| 日韩国产一级片| 九九热这里有精品| 亚洲成成品网站| 天天操天天摸天天干| 国产老妇另类xxxxx| 老牛影视免费一区二区| 欧美中文字幕精在线不卡| 日韩手机在线导航| 一区二区三区在线观看免费视频| 欧美天天视频| 国产日本欧美一区二区三区| 超碰超碰在线| 欧美三日本三级三级在线播放| 日本黄色录像片| 日韩专区一卡二卡| 四虎永久免费网站| 色天下一区二区三区| 国产精品白嫩美女在线观看| 精品黄色免费中文电影在线播放| 色丁香久综合在线久综合在线观看| 日韩毛片无码永久免费看| 狠狠色综合播放一区二区| 日韩中文一区二区三区| 国产专区精品| 久久亚洲精品小早川怜子66| 亚洲精品人妻无码| 欧美中文字幕亚洲一区二区va在线| 色婷婷粉嫩av| 99国产精品久久| 青青草久久伊人| 欧洲视频一区| 999精品视频一区二区三区| 亚洲淫成人影院| 日韩av网站在线| 日本在线小视频| 亚洲国产精品国自产拍av| 无码国产精品久久一区免费| 亚洲国产精品久久久天堂| 精品国产乱码久久久久久88av | 日本精品视频一区二区三区| 欧美手机在线观看| 看片的网站亚洲| 一卡二卡3卡四卡高清精品视频| 亚洲一区二区三区日本久久九 | 欧美久久一区二区三区| 日韩av片永久免费网站| 午夜av免费观看| 亚洲一区二区三区影院| 免费福利视频网站| k8久久久一区二区三区| 逼特逼视频在线| 欧美成熟视频| 国产精品国产一区二区 | 亚洲人成精品久久久久久| 精品人妻一区二区三区视频| 99综合视频| 免费成人深夜夜行视频| 日韩激情欧美| 国内免费精品永久在线视频| 日韩一区免费视频| 性做久久久久久免费观看欧美| 50一60岁老妇女毛片| 久久er99热精品一区二区| 看一级黄色录像| 久久视频在线| 99国产盗摄| 欧美久久天堂| 性色av一区二区三区红粉影视| 精品自拍一区| 久久久精品视频在线观看| 亚洲xxx在线| 日韩一区二区精品葵司在线| 国产一区二区三区成人| 欧美日韩国产免费| 中文字幕91爱爱| 欧美性xxxxxx少妇| 中文字幕+乱码+中文字幕明步 | 国产一级不卡毛片| 美女久久一区| 亚洲综合激情五月| 日韩国产专区| 国产伦精品一区二区三区| 免费精品一区二区三区在线观看| 国产一区玩具在线观看| 国产成人精品一区二区三区视频 | 午夜激情视频在线播放| 国产精品人成在线观看免费| 蜜桃av.com| 亚洲免费av网站| 永久免费看mv网站入口78| 免费人成在线不卡| 国产小视频精品| 另类欧美日韩国产在线| 污污的视频免费观看| 国产资源在线一区| 极品人妻一区二区| 丁香激情综合国产| 国产传媒第一页| 国产一区视频导航| 久久久久久久穴| 蜜桃在线一区二区三区| 天天av天天操| 成人99免费视频| 日韩av片免费观看| 国产成人免费xxxxxxxx| 国产精品一区二区人妻喷水| 久久只精品国产| 美女福利视频网| 亚洲一卡二卡三卡四卡无卡久久| 久久久久久久久久影院| 欧美优质美女网站| a在线观看视频| 日韩风俗一区 二区| 精品久久久久久久久久中文字幕| 宅男66日本亚洲欧美视频| 天天操天天操天天| 亚洲视频一区二区| 欧美成人xxx| 日韩av中文在线| 黑人与亚洲人色ⅹvideos| 日韩亚洲欧美中文在线| 另类视频在线| 另类色图亚洲色图| 国产污视频在线播放| 国产精品久久久久久久久免费| 91久久青草| 蜜桃视频日韩| 综合精品久久| 国产美女视频免费| 日韩图片一区| 天堂在线一区二区三区| 972aa.com艺术欧美| 一级片黄色录像| 国产精品三级av在线播放| 欧美爱爱小视频| 亚洲激情图片qvod| 亚洲欧美小视频| 精品成人国产在线观看男人呻吟| 中文字幕 日韩有码| 精品盗摄一区二区三区| 丰满肉嫩西川结衣av| 日韩av中文字幕在线免费观看| 免费在线视频欧美| 4p变态网欧美系列| 中文在线资源| 51精品国产人成在线观看| 国产在视频线精品视频www666| 男人草女人视频| 亚洲天堂成人| 日本中文字幕影院| 久久蜜臀中文字幕| 日韩伦理在线视频| 日韩区在线观看| 伊人免费在线| 国产精品网红福利| 亚洲ww精品| 欧美一卡2卡3卡4卡无卡免费观看水多多| 杨幂一区二区三区免费看视频| 欧美大香线蕉线伊人久久| 国产精品videosex极品| 午夜剧场高清版免费观看 | 在线视频你懂得一区| 蜜臀av在线观看| 色综合视频一区中文字幕| www久久久| 性做爰过程免费播放| 久久99精品久久久| 毛片视频免费播放| 欧美性欧美巨大黑白大战| 欧美zzoo| 日本中文字幕久久看| 欧美男人操女人视频| aa视频在线播放| 成人国产精品免费| 国产网站在线看| 亚洲精品国偷自产在线99热| 色播色播色播色播色播在线| 国产一区二区精品丝袜| 米奇精品一区二区三区| 国产91网红主播在线观看| 西野翔中文久久精品字幕| 精品欧美一区免费观看α√| 99久久精品免费观看| 国产成人精品a视频一区| 亚洲国产天堂网精品网站| www.综合| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 制服丝袜中文字幕一区| 黄色免费在线观看网站| 91在线免费看网站| 欧美黄色aaaa| 又黄又色的网站| 欧美日韩视频在线| 国产剧情久久久| 亚洲精品美女久久久久| 九九色在线视频| 欧美深深色噜噜狠狠yyy| 免费一区二区视频| 黄色片在线观看网站| 精品88久久久久88久久久| 涩涩网在线视频| 日韩久久久久久久久久久久久| 蜜臀av一区二区三区| 午夜精品一区二区三区视频| 精品国产一二三区| 亚洲精品福利电影| 亚洲精品中字| 高清shemale亚洲人妖| 欧美激情视频二区| 宅男在线国产精品| 黄色影院在线看| 欧美精品久久久| 日本va欧美va瓶| 久久久久亚洲av无码专区桃色| 在线亚洲一区二区| 国产欧美黑人| 久久精品99| 激情综合五月婷婷| 狠狠躁夜夜躁人人爽天天高潮| 亚洲性xxxx| 综合欧美亚洲| 宅男噜噜噜66国产免费观看| 97国产一区二区| 亚洲精品一区二区二区| 亚洲精品一区二三区不卡| 久草在线新免费首页资源站| 久久精品日产第一区二区三区乱码 | 97av自拍| 日日夜夜免费精品| 久久免费在线观看视频| 欧美一区二区在线免费播放| 欧美aa免费在线| 免费成人深夜夜行网站视频|