麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 語言 > PHP > 正文

純真ip數據庫查詢的php實現(補充分組查詢)

2024-09-04 11:50:11
字體:
來源:轉載
供稿:網友

原文發表于鳳凰花論壇:http://www.fenghuanghua.com/bbs/viewthread.php?tid=34&extra=page%3D1 有興趣的朋友可以在那里討論。 純真數據庫是國內用的最多的ip-地理信息數據庫,雖然不怎么專業,但是數據蠻全的,數據結構也比較合理。

關于純真數據庫的數據結構,可以看一下lumaqq的文檔,里面有一點說的不太清楚,就是里面的ip和地理信息不是一對一,是多對一,所以ip一般是ip段。查詢的時候是查詢ip地址落在哪個段。

純真數據庫的查詢算法也已經有人實現了:http://www.companysz.com/article/2008/4055.shtml

用的是線性表的二分查詢。

純真數據庫比較大,大約有60萬的記錄,上面的算法基本上可以接受了,平均查詢效率在2ms左右,對于單機程序,完全可以忽略,但是對于并發比較大的系統,比如統計系統,這樣的效率還不夠。

既然數據是線性存儲的,那么就可以采用分段查詢,預先將數據隔成段,查詢時,先找到相應的段,然后進行二分查詢。

二分查詢的平均查找長度是:lg(n+1)-1
那么分塊詢找+二分查詢的平均查找長度就是:(設塊數為N)分塊也進行二分查找,所以查找塊的平均長度是lg(N+1)-1,每塊長度是n/N ,所以最終長度是:lg(N+1)-1 + lg(n/N+1)-1

根據上面的公式,代入n可以算出一個最佳塊數N,也就是最佳查詢時間了。數據量越大,查詢速度越快,數據量比較小的表就沒必要分塊了。

我高數學得不好,不知道對不對。請大蝦指正,另外幫忙算一下6249322條數據的最佳塊數。

修改后的代碼如下:(function separate($count)是我添加的分塊函數,if($separator){}所在部分是二分查找塊)

<?php
/**
* IP 地理位置查詢類
* 增加分塊查詢算法
*
* @author 馬秉堯
* @version 1.5
* @copyright 2005 CoolCode.CN
* @modified by david  blog:blog.iyi.cn bbs:www.fenghuanghua.com
*/
class IpLocation {
    /**
     * QQWry.Dat文件指針
     *
     * @var resource
     */
    var $fp;

    /**
     * 第一條IP記錄的偏移地址
     *
     * @var int
     */
    var $firstip;

    /**
     * 最后一條IP記錄的偏移地址
     *
     * @var int
     */
    var $lastip;

    /**
     * IP記錄的總條數(不包含版本信息記錄)
     *
     * @var int
     */
    var $totalip;

    /**
     * 返回讀取的長整型數
     *
     * @access private
     * @return int
     */
    function getlong() {
        //將讀取的little-endian編碼的4個字節轉化為長整型數
        $result = unpack('Vlong', fread($this->fp, 4));
        return $result['long'];
    }

    /**
     * 返回讀取的3個字節的長整型數
     *
     * @access private
     * @return int
     */
    function getlong3() {
        //將讀取的little-endian編碼的3個字節轉化為長整型數
        $result = unpack('Vlong', fread($this->fp, 3).chr(0));
        return $result['long'];
    }

    /**
     * 返回壓縮后可進行比較的IP地址
     *
     * @access private
     * @param string $ip
     * @return string
     */
    function packip($ip) {
        // 將IP地址轉化為長整型數,如果在PHP5中,IP地址錯誤,則返回False,
        // 這時intval將Flase轉化為整數-1,之后壓縮成big-endian編碼的字符串
        return pack('N', intval($ip));
    }

    /**
     * 返回讀取的字符串
     *
     * @access private
     * @param string $data
     * @return string
     */
    function getstring($data = "") {
        while (ord($char = fread($this->fp, 1)) > 0) {        // 字符串按照C格式保存,以 主站蜘蛛池模板: 在线天堂中文在线资源网 | 羞羞网站视频 | xxxx69hd一hd72 | 亚洲第一色片 | 成人在线观看一区 | 视频在线色 | 国产精品99久久久久久久vr | 九草网 | 高清视频一区二区 | 香蕉国产在线视频 | 黄色毛片免费看 | 成年性羞羞视频免费观看 | 久久久一区二区三区精品 | 国产人成免费爽爽爽视频 | gogo全球大胆高清人露出91 | 久久综合av| av在线免费观看中文字幕 | www国产成人免费观看视频,深夜成人网 | 久草在线高清 | 国产一级毛片a | 免费播放av| 欧美自拍三区 | 免费网址黄 | 色欧美视频 | 欧美精品亚洲人成在线观看 | 草操视频 | av在线日韩 | 91在线视频观看 | 亚洲国产网址 | 欧美一区二区三区中文字幕 | 久久久久久久久国产精品 | 日日噜噜噜夜夜狠狠久久蜜桃 | 九色新网址 | 亚洲乱搞 | 成人国产在线看 | 久草在线高清 | av电影在线观看网址 | china对白普通话xxxx | 日韩黄色免费电影 | 国产理论视频在线观看 | 国产91久久精品一区二区 |