Publish: April 20, 2016
Category: 代码分享
No Comments
数据库中,存储数据千万级别的搜索中,数字类型会比字符串类型快很多,在设计数据库的时候经常页将一些可转换的字段用数字来标示,比如IP和MAC.
PHP中提供了原生的ip地址和数字互转函数即ip2long()和long2ip().int ip2long ( string $ip_address );
string long2ip ( string $proper_address );
MAC地址和数字的互转, mac是十六进制标示,去掉分隔符之后正好是一个十六进制数,可以直接转换为十进制数,同样十进制数转换成mac时,不够12位的在前面补零./**
* mac合法性校验 兼容大小写和(:-)
* @param $mac
* @return bool
*/
function mac_check($mac)
{
if (empty($mac)) {
return FALSE;
}
$mac_reg = '/^([0-9a-fA-F]{2})((([:][0-9a-fA-F]{2}){5})|(([-][0-9a-fA-F]{2}){5}))$/i';
return preg_match($mac_reg, $mac)==1?TRUE:FALSE;
}
/**
* mac 转化为数字表示
* @param $mac_str
* @return bool|number
*/
function mac_to_int($mac_str)
{
if(!mac_check($mac_str)) return FALSE;
$filter_mac = strtolower(preg_replace('/[:-]/', '', $mac_str));
$mac_int = hexdec($filter_mac);
if(is_numeric($mac_int))
return $mac_int;
else
return FALSE;
}
/**
* 数字转换为标准mac
* @param $mac_int
* @param string $chain ('-', ':')
* @return bool|string
*/
function int_to_mac($mac_int, $chain='-')
{
$max_value = 281474976710655;
$min_value = 0;
if(!is_numeric($mac_int) || $mac_int > $max_value || $mac_int < $min_value) return FALSE;
$chain_list = array('-', ':');
if(!in_array($chain, $chain_list)) return FALSE;
$mac_hex = dechex($mac_int);
$mac_str = strval($mac_hex);
$mac_hex_len = strlen($mac_hex);
if($mac_hex_len < 12)
{
$add_len = 12 - $mac_hex_len;
$add_str = '';
while ($add_len--)
{
$add_str .= '0';
}
$mac_str = $add_str . $mac_str;
}
$mac_arr = str_split($mac_str, 2);
$mac_full_str = implode($chain, $mac_arr);
if(!mac_check($mac_full_str))
return FALSE;
else
return strtoupper($mac_full_str);
}
demo示例:echo mac_to_int('ac-2d-2a-de-32-1d');
// 输出 189309992710685
echo int_to_mac(189309992710685);
//输出 AC-2D-2A-DE-32-1D[尚无相关文章]