ipv4的地址字符串分布为0.0.0.0->255.255.255.255,其中最小长度为7,最大长度为15。
假设其均匀分布,则需要平均占用13.28125字符,计算方法如下,如果将这些字符串存储在数据库中,则还需要一个字符记录字符串的长度,则平均需要占用14.28字符。
相比使用无符号的int(4个字符),其需要多占用10个字符,而且这个只是先对一条记录的情况下,这是一个累积的过程。
public class AddUtil {public static void main(String[] args) {List<Long> list = new ArrayList<>();// 4 1111list.add(10L * 10 * 10 * 10 * 7);// 5 2111(4)list.add(90L * 10 * 10 * 10 * 4 * 8);// 6 3111(4) 2211(6)list.add(156L * 10 * 10 * 10 * 4 * 9);list.add(90L * 90 * 10 * 10 * 6 * 9);// 7 3211(12) 2221(4)list.add(156L * 90 * 10 * 10 * 12 * 10);list.add(90L * 90 * 90 * 10 * 4 * 10);// 8 2222 3311(6) 3221(12)list.add(90L * 90 * 90 * 90 * 11);list.add(156L * 156 * 10 * 10 * 6 * 11);list.add(156L * 90 * 90 * 10 * 12 * 11);// 9 2223(4) 1233(12)list.add(90L * 90 * 90 * 156 * 4 * 12);list.add(10L * 90 * 156 * 156 * 12 * 12);// 10 2233(6) 1333(4)list.add(90L * 90 * 156 * 156 * 6 * 13);list.add(10L * 156 * 156 * 156 * 4 * 13);// 11 2333(4)list.add(90L * 156 * 156 * 156 * 4 * 14);// 12 3333list.add(156L * 156 * 156 * 156 * 15);Long result = 0L;for (Long temp : list) {//System.out.println(temp);result += temp;}long target = 256L * 256 * 256 * 256;System.out.println(result);System.out.println(target);System.out.println(average(result, target));}public static BigDecimal average(long result, long times){BigDecimal dividend = new BigDecimal(result);BigDecimal divisor = new BigDecimal(times);for (int i = 0; i < 7; i++) {System.out.println(i + " : " + dividend.divide(divisor.negate(),2,i));System.out.println(i + " : " + dividend.divide(divisor,2,i));}return dividend.divide(divisor,2,5);}
}
BigDecimal保留小数的计算格式
roundingMode | 作用 |
---|---|
0 | 去掉后面的直接+1 |
1 | 直接截断指定的小数位,例如1.555保留2位,结果为1.55 |
2 | 去掉后面(向大舍入),+1或不变取决于值的正负,正+1,负不变 |
3 | 去掉后面(向小舍入),+1或不变取决于值的正负,正不变,负+1 |
4 | 标准的四舍五入 |
5 | 只有当舍去的部分>0.5时,才会+1,例如1.555的保留2位小数的结果时1.55 |
6 | 当最后一位为奇数时,走4的舍入逻辑;当最后一位为偶数时,走5的逻辑,例如1.555、1.545保留2位小数的结果是:1.56、1.54 |
7 | 计算的结果是确切的,会有指定的小数结果,否则抛出异常 |
执行性能分析
原文:https://bafford.com/2009/03/09/mysql-performance-benefits-of-storing-integer-ip-addresses/
MySQL的INET_ATON会将ipv4字符串分为4个整数,再依次将这些整数转换成对应的8位二进制,将这个4个8位二进制按照顺序连接起来,形成一个32位的二进制,一个无符号整数。
192.168.1.1
1100 0000
1010 1000
0000 0001
0000 0001
11000000101010000000000100000001
3232235777