IP 地址 整型 互转 算法

GeoIP Country CSV Text Files

MaxMind GeoIP databases are available in a Comma Separated Value (CSV) format, in addition to the binary format. These CSV files generally contain IP Address range and geographical data for all publicly assigned IPv4 addresses.

Due to the large size of geolocation databases, we generally recommend using our binary format with one of our APIs, since they are highly optimized for speed and disk space. On the other hand, if you have a requirement to import the data into a SQL database, the CSV format is recommended. We have listed some guidelines for importing and querying the data with a SQL database.

CSV Format
The CSV File contains six fields:
  • Beginning IP Address
  • Ending IP Address
  • Beginning IP Number*
  • Ending IP Number*
  • ISO 3166 Country Code
  • Country Name

This is an sample of how the CSV file is structured:

"begin_ip","end_ip","begin_num","end_num","country","name"

"61.88.0.0","61.91.255.255","1029177344","1029439487","AU","Australia"

"61.92.0.0","61.93.255.255","1029439488","1029570559","HK","Hong Kong"

"61.94.0.0","61.94.7.255","1029570560","1029572607","ID","Indonesia"

* Beginning IP Number and Ending IP Number are calculated as follows:
ipnum = 16777216*w + 65536*x + 256*y + z   (1)



where



IP Address = w.x.y.z



The reverse of this formula is



w = int ( ipnum / 16777216 ) % 256;

x = int ( ipnum / 65536    ) % 256;

y = int ( ipnum / 256      ) % 256;

z = int ( ipnum            ) % 256;



Where % is the mod operator.

Here is sample Perl code to convert the IP number to a IP address:
sub numToStr {

  my ($ipnum) = @_;

  my $z = $ipnum % 256;

  $ipnum >>= 8;

  my $y = $ipnum % 256;

  $ipnum >>= 8;

  my $x = $ipnum % 256;

  $ipnum >>= 8;

  my $w = $ipnum % 256;

  return "$w.$x.$y.$z";

}

It is useful to have the IP Number if you are performing IP Address lookups using a database. For example the following queries will find the country based on IP Address 24.24.24.24:

SQL Query

SELECT ip_country FROM geoip WHERE 404232216 BETWEEN begin_ip_num AND end_ip_num LIMIT 1

MySQL Query
SELECT ip_country FROM geoip WHERE 404232216 >= begin_ip_num AND

	404232216 <= end_ip_num LIMIT 1

Here we used the formula (1) to compute the IP Number based on 24.24.24.24
404232216 = 16777216*24 + 65536*24 + 256*24 + 24

Usage with GeoIP or GeoLite City
Here's a relatively faster way to query the GeoIP City CSV file in MySQL:

First create the SQL table as follows.

CREATE TABLE `geo_blocks` (

`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,

`location_id` INT(10) UNSIGNED NOT NULL,

`ip_start` INT(10) UNSIGNED NOT NULL,

`ip_end` INT(10) UNSIGNED NOT NULL,

`index_geo` INT(10) UNSIGNED NOT NULL,

PRIMARY KEY (`id`),

INDEX `idx_start` (`ip_start`),

INDEX `idx_end` (`ip_end`),

INDEX `idx_geo` (`index_geo`)

);



update `geo_blocks` set `index_geo` = (`ip_end` - mod(`ip_end`, 65536));

To select the location, run:
SELECT 



... 



FROM 



geo_blocks 



... 



WHERE 



index_geo = INET_ATON("92.229.175.253")-(INET_ATON("92.229.175.253")%65536) AND



INET_ATON("92.229.175.253") BETWEEN ip_start AND ip_end;

Contributed by Kamil Kubica

Guides Please see our GeoIP Resources page for links on how to load the GeoIP files into MySQL, Oracle, PostgreSQL, and MS Access.

你可能感兴趣的:(算法)