zoukankan      html  css  js  c++  java
  • MySQL中以数值类型存储IP地址

    前言

      数据库中存储IP地址的时候,推荐使用整数存储而不是字符串。一般来说, 在保证正确性的前提下,尽量使用最小的数据类型来存储和展示数据;小的数据类型一般比大的更快,因为小的数据类型占用的磁盘空间,内存和cup缓存都相对小,需要的cpu处理也要相对少; 这个原则很重要,设计的时候不要低估待存储数据的数据范围。

    IPv4地址和int类型数字互转

    package com.hoss.ext.authentication;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * IPv4地址和int类型数字互转
     *
     * @author Wiener
     * @date 2021/4/29
     */
    public class SaveIp {
    
        public static void main(String[] args) {
            String ip = "127.0.0.1";
            String ip33 = "172.16.24.33";
            String ip13 = "172.16.10.13";
            String ip89 = "111.112.113.114";
            intToIp(ipToInt(ip89));
        }
    
        /**
         * (Ip转Integer)
         * 方法名:ipToInt
         *
         * @throws
         * @since 1.0.0
         */
        public static int ipToInt(String ip) {
            if (!isIPv4Address(ip)) {
                throw new RuntimeException("Invalid ip address");
            }
            String[] ips = ip.split("\.");
            int ipInt = 0;
            //因为每个位置最大255,刚好在2进制里表示8位
            for (String ip4 : ips) {
                Integer ip4a = Integer.parseInt(ip4);
                //这里应该用+也可以,但是位运算更快
                ipInt = (ipInt << 8) | ip4a;
            }
            System.out.println(ipInt);
    
            return ipInt;
        }
    
        /**
         * 判断是否为ipv4地址
         *
         * @param ipv4Addr
         * @return true 是ipv4地址
         */
        private static boolean isIPv4Address(String ipv4Addr) {
            // 0-255的数字
            String lower = "(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])";
            String regex = lower + "(\." + lower + "){3}";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(ipv4Addr);
            return matcher.matches();
        }
    
        /**
         * (Integer转IP)
         * 方法名:intToIp
         *
         * @param ip数字
         * @return String
         */
        public static String intToIp(int ip) {
            //思路很简单,每8位拿一次,就是对应位的IP
            StringBuilder sb = new StringBuilder();
            for (int i = 3; i >= 0; i--) {
                int ipa = (ip >> (8 * i)) & (0xff);
                sb.append(ipa + ".");
            }
            sb.delete(sb.length() - 1, sb.length());
            System.out.println("数字转IP:" + sb);
            return sb.toString();
        }
    
    }
    

    Reference


      读后有收获,小礼物走一走,请作者喝咖啡。

    赞赏支持

  • 相关阅读:
    java基础---多线程---volatile详解
    java基础---多线程---线程的几种状态及其转换,wait,notify,sleep,yield,join
    java基础---设计一个死锁
    count(1) and count(*),count(字段)区别及效率比较
    mysql之字段约束-第五篇
    mysql之数据表基本操作-第四篇
    mysql之数据类型-第三篇
    mysql之存储引擎-第二篇
    mysql之数据库操作-第一篇
    Redis详解
  • 原文地址:https://www.cnblogs.com/east7/p/14722866.html
Copyright © 2011-2022 走看看