6

我正在做一个我们需要做的项目IP Address lookups。因此,为此我们得到了如下所示的数据集,现在下一步是将这些数据集(可能是 csv 文件)填充到MySql table. 下面是包含列的数据集示例 -

ip_address      country region  city           metro-code   latitude    longitude   postal-code   country-code   region-code    city-code   continent-code  country-code

24.32.116.116   usa       tx    clarksville    623           33.6103    -95.0498    75426            840           44             34918            6            us
65.29.108.232   usa       mi    novi           505           42.4637    -83.4604    48375            840           23             4339             6            us
66.169.99.69    usa       tx    ft worth       623           32.7016    -97.3823    76109            840           44             771              6            us
72.70.100.111   usa       ma    peabody        506           42.5332    -70.9726    1960             840           22             1392             6            us
174.252.116.137 usa       va    oakton         511           38.8892    -77.3222    22124            840           47             3860             6            us
68.55.144.242   usa       md    pasadena       512           39.1276    -76.5125    21122            840           21             4358             6            us
174.252.83.27   usa       pa    lancaster      566           40.0459    -76.3542    17603            840           39             333              6            us
174.78.192.31   usa       ga    warner robins  503           32.5958    -83.6384    31088            840           11             5052             6            us
98.192.146.235  usa       fl    panama city    656           30.1804    -85.5598    32404            840           10             671              6            us
71.192.181.20   usa       ma    springfield    543           42.1187    -72.5483    1109             840           22             967              6            us
76.183.54.227   usa       tx    dallas         623           32.7202    -96.6769    75217            840           44             77               6            us
69.62.143.140   usa       ca    granite bay    862           38.7442    -121.191    95746            840           5              49451            6            us
69.142.76.32    usa       nj    penns grove    504           39.707     -75.4467    8069             840           31             2335             6            us
70.173.54.93    usa       nv    las vegas      839           36.2059    -115.225    89108            840           29             173              6            us
98.242.8.222    usa       ca    fresno         866           36.7968    -119.883    93722            840           5              19               6            us

问题陈述:-

我打算将START_IP_NUMand存储END_IP_NUMBIGINTMySql 数据库中,而不是存储IP Address在表中,因为对 BIGINT 进行查找比搜索字符串(点 ip 表示法)要快得多。就像我们为 Maxmind 设置数据库一样。

所以我的问题是我们将Java Program在 MySql 表中填充上述数据集。所以我需要设备某种逻辑,可以将上述数据集转换为如下所示 -

start_ip_num
end_ip_num
country 
region  
city           
metro-code  
latitude    
longitude   
postal-code   
country-code     
region-code 
city-code   
continent-code  
country-code

给定一个 IP 地址,我很困惑,我应该如何在此处进行设备start_ip_num并将end_ip_num其存储到MySql table. 因为我假设会有一个文件包含上面的数据集,然后我需要读取该文件和设备某种逻辑以将 IP 地址转换为两个 BIGINT 并将其存储到 MySql 表中。

并将其存储到 MySql 数据库中。我可以在 MySql 中查找类似的内容-

SELECT country
FROM geoip
WHERE
INET_ATON('174.36.207.186') BETWEEN start_ip_num AND end_ip_num
LIMIT 1

更新:-

假设我在上面提到的格式的文本文件中有几个Thousands IP Address类似的东西。100,000 IP Addresses

现在我的主要目标是做IP Address lookup. 与此相对应,IP Address我得到了所有其他必填字段。

因此,为了使这件事起作用,我最初计划将文本文件数据转储为MySql table. 所以 MySql 表将包含IP Address列和其他列,就像我在上面的例子中一样。但是对 String 进行查找是昂贵的。

所以我想我应该将这些 IP 地址start_ip_numend_ip_num范围转换,然后转储数据,MySql table所以现在它看起来像这样 -

start_ip_num
end_ip_num
country 
region  
city           
metro-code  
latitude    
longitude   
postal-code   
country-code     
region-code 
city-code   
continent-code  
country-code

现在,如果我需要进行查找,我可以将它SQL query嵌入到我的WebService eventually-

SELECT country
FROM geoip
WHERE
INET_ATON('174.36.207.186') BETWEEN start_ip_num AND end_ip_num
LIMIT 1

所以问题是 -给定一个Text file将有列表IP Addresses和其他字段对应的字段,我应该如何按摩它,以便我可以以我上面提到的格式将相同的数据集存储在 MySql 中,IP Address例如start_ip_numand和其他字段。end_ip_numcountry

基本上,我正在尝试遵循 Maxmind 目前的数据库模式。他们也有start_ip_numandend_ip_num等领域。当您需要进行查找时,您可以根据我上面提到的 SQL 将 IP 地址转换为BIGINTusing来进行查找INET_ATON

4

3 回答 3

1

IPv4 地址包含 4 个数字,每个数字的范围为 0...255

您可以使用此逻辑将地址 ABCD 转换为 32 位整数(或 bigint,如果您愿意)

Result = (A<<24) | (B<<16) | (C<<8) | D

其中 A,B,C,D 是整数。这是我们使用的方法,我认为这甚至最初是针对 MaxMind 进行的测试。(抱歉,如果不完全是 java 示例)

于 2013-03-12T09:31:04.607 回答
0

您在 IP 地址中有原始数据,您希望它以范围格式表示。这是它应该如何工作的流程图。

1)将所有IP地址转换为IP号 2)IP号升序排序 3)扫描记录并压缩同城记录

例如,IP 1 和 IP 2 在 X 市。您可以将其表示为 1,2,X。

这里的假设是您拥有几乎所有的 IP 地址。如果 2 个号码之间有缺失的差距,则需要假设它来自同一个城市 X。例如,IP 1 和 IP 3 在 X 城市,您也假设 IP 2 在 X。1,3,X。

于 2013-03-13T00:37:39.880 回答
0

您似乎在 IpAddress 与其在世界上的物理位置之间建立了某种硬关系。例如,如果两个密切相关的 IpAdresse 来自纽约,那么任何具有这两个 IpAdresse 之间值的 IpAdresse 也应该来自纽约;正确的?

错误的!

IP 地址在全球的分布是完全任意的,而 IP 地址通常以块的形式分布到国家、地区、大公司等;之后发生的事情或多或少是任意的。例如,微软和谷歌等大公司拥有自己的 IP 地址块;然而,他们用它做什么是完全任意的,微软选择用一个 IP 地址做什么可能与下一个或以前的地址完全不同。甚至有可能一个 IP 地址会在一天指向一个国家,而在第二天指向另一个国家,因为网络拓扑发生了变化。

在 IP 地址与其物理位置之间建立关系需要一个非常广泛的数据库,即使在这种情况下,也很容易出现错误和日常变化。甚至谷歌使用的数据库也可能充满了错误;尽管有大量数据。

于 2013-03-12T21:31:26.760 回答