IP를 정수 저장소로 변환하는 것은 데이터베이스 최적화의 주요 추세입니다. 많은 사람들이 IP를 저장할 때 여전히 문자열 유형 저장소를 사용하고 있습니다. 특히 테이블의 데이터 양이 클 경우 문자열 인덱스는 정수 인덱스보다 훨씬 더 많은 리소스를 소비합니다. 시간이며 특정 IP 세그먼트의 데이터를 쿼리하려는 경우 오늘 언급된 IP는 ip4를 나타내며 ip6은 이 기사의 범위에 속하지 않습니다.
시스템 기능 ip2long 및 long2ip
PHP에는 IP 주소를 정수로 변환할 수 있는 ip2long 함수가 내장되어 있습니다.
$ip = '210.110.11.49';
에코 ip2long($ip);
출력:
-764540111
우리가 얻는 결과는 부호 있는 정수 유형이기 때문에 출력 정수 유형에는 음수 부호가 있습니다. 부호 있는 정수 유형의 최대값은 2147483647입니다. 결과를 부호 없는 유형으로 변환하려면 다음과 같이 작성할 수 있습니다.
3530427185
long2ip를 사용하여 정수를 다시 IP 주소로 변환
$ip = '210.110.11.49';
$ip_int = ip2long($ip);
echo $ip."
";
echo $ip_int."
";
echo long2ip($ip_int);
출력:
210.110.11.49
-764540111
210.110.11.49
결과에서 알 수 있듯이, ip와 정수형은 함수를 통해 완성될 수 있다.
시스템 기능의 작은 버그
이 버그는 인터넷에서 찾을 수 있습니다. 일반적인 아이디어는 IP 주소의 특정 부분에 앞에 0을 추가하는 것입니다. 먼저 이 버그의 예를 살펴보겠습니다.
$ip = '210.110.011.49';
$ip_int = ip2long($ip);
echo $ip."
";
echo $ip_int."
";
echo long2ip($ip_int);
출력:
210.110.011.49
-764540623
210.110.9.49
변환 결과가 일치하지 않습니다. IP의 첫 번째 숫자 앞에 0을 추가하고 다시 살펴보겠습니다
$ip = '021.110.11.49';
$ip_int = ip2long($ip);
echo $ip."
";
echo $ip_int."
";
echo long2ip($ip_int);
출력:
021.110.11.49
292424497
17.110.11.49
변환 결과가 모두 잘못되었습니다. 위의 예는 모두 앞에 0을 추가하여 발생하므로 변환 결과에 오류가 발생하고 관련 반전 결과가 원래 변환 IP와 일치하지 않습니다.
변환 원리
현재 두 가지 알고리즘이 있습니다:
첫 번째 문단과 첫 번째 문단에 256의 세제곱을 곱하고, 두 번째 문단에 256의 제곱을 곱하고, 세 번째 문단에 256을 곱하여 최종 합은 입니다.
코드 복사 코드는 다음과 같습니다.
$ip = '0210.110.11.49';
함수 ipToInt($ip){
$iparr = 폭발('.',$ip);
$num = 0;
for($i=0;$i
$num = intval($iparr[$i]) * pow(256,count($iparr)-($i 1));
}
$num 반환;
}
echo $ip.'
';
$ip_int = ipToInt($ip);
echo $ip_int.'
';
echo long2ip($ip_int);
출력:
0210.110.11.49
3530427185
210.110.11.49
두 번째, 비트 연산자를 통해
$ip = '0210.110.11.49';
함수 ipToInt($ip){
$iparr = 폭발('.',$ip);
return (intval($iparr[0]
}
echo $ip.'
';
$ip_int = ipToInt($ip);
echo $ip_int.'
';
echo long2ip($ip_int);
출력:
0210.110.11.49
-764540111
210.110.11.49
적법한 IP인지 확인
먼저 스스로 탐색하고 감지하세요
함수 check_ip($ip){
$iparr = 폭발('.',$ip);
foreach($iparr as $v){ if($v>255) return false }
true를 반환합니다.
}
echo '210.285.11.49,';
var_dump(check_ip('210.285.11.49'));
echo '
';
echo '210.205.11.49,';
var_dump(check_ip('210.205.11.49'));
[코드]
출력:
[코드]
210.285.11.49,bool(false)
210.205.11.49,bool(true)
두 번째, ip2long을 사용하여 반환
함수 check_ip($ip){
If(ip2long($ip))는 true를 반환합니다.
false를 반환합니다.
}
echo '210.285.11.49,';
var_dump(check_ip('210.285.11.49'));
echo '
';
echo '210.205.11.49,';
var_dump(check_ip('210.205.11.49'));
출력:
210.285.11.49,bool(false)
210.205.11.49,bool(true)
후기
많은 사람들이 ip2long을 사용하여 IP 쓰기 라이브러리를 int 유형 필드를 저장하도록 변환합니다. 그러나 시스템 플랫폼에 따라 ip2long 함수로 얻은 값이 다르기 때문에 데이터를 읽을 때 IP가 반전될 수 있습니다. 데이터베이스에서 long2ip를 사용하여 얻은 IP가 원래 IP와 일치하지 않습니다
mysql이라면 mysql 시스템 함수인 INET_ATON, INET_NTOA를 이용해 문제를 해결할 수도 있고, bigint 타입을 이용해 처리하거나 함수를 직접 작성할 수도 있다.