过滤白名单算法
来源:互联网 发布:godaddy 域名赎回期 编辑:程序博客网 时间:2024/05/02 02:51
昨天面试的时候,面试官出了一道算法题,当时头脑有点乱,没有想出来,现在把它写出来
题目:给定几个白名单网段,例如 "172.16.0.0/17", "192.168.0.0/24", "10.10.10.10/9",现在有个请求过来,怎么快速确认请求IP是否在白名单中?
package common;import org.junit.Test;public class WhiteListTest{private String[] whiteList = { "172.16.0.0/17", "192.168.0.0/24", "10.10.10.10/9" };@Testpublic void test(){String testIp = "192.168.0.1";for (String net : whiteList){NetworkOffset offset = new NetworkOffset(net);System.out.println(offset);if (offset.matches(testIp)){System.out.println("found");}}}private static class NetworkOffset{private int mask;private int baseIp;NetworkOffset(String net){init(net);}private void init(String net){mask = Integer.valueOf(net.split("/")[1]);mask = 0xFFFFFFFF << (32-mask);String address = net.split("/")[0];baseIp = parseAddr(address);}boolean matches(int ip){return (baseIp & mask) == (ip & mask);}boolean matches(String ip){return matches(parseAddr(ip));}private int parseAddr(String addr){String[] array = addr.split("\\.");int ip = 0;for (int i = 0; i < array.length; i++){int part = (Integer.parseInt(array[i]) & 0xFF) << (24 - 8 * i);ip = ip | part;}return ip;}String first(){int firstIp = baseIp & mask | 0x01;return toIpString(firstIp);}String last(){int lastIp = baseIp & mask | (~mask & 0xFFFFFFFE);return toIpString(lastIp);}private String toIpString(int ip){String part1 = String.valueOf(ip >> 24 & 0xFF);String part2 = String.valueOf(ip >> 16 & 0xFF);String part3 = String.valueOf(ip >> 8 & 0xFF);String part4 = String.valueOf(ip & 0xFF);return part1 + "." + part2 + "." + part3 + "." + part4;}String broadcast(){int broadcastIp = baseIp & mask | (~mask);return toIpString(broadcastIp);}@Overridepublic String toString(){return "NetworkOffset [mask=" + Integer.toBinaryString(mask) + ", baseIp=" + Integer.toBinaryString(baseIp)+ ", firstIp=" + first() + ", lastIp=" + last() + ", broadcastIp=" + broadcast() + "]";}}}
阅读全文
0 0
- 过滤白名单算法
- 【Practice】白名单过滤程序
- 网站白名单过滤Java代码
- KindEditor白名单过滤和视频发布
- zigbee实现网络加入过滤(相当于白名单)
- 白名单
- apache层的账户权限控制,以及apache黑名单白名单过滤功能
- 防止XSS攻击的方法-使用白名单过滤html标签
- 百度编辑器Ueditor的黑白名单过滤
- 百度编辑器Ueditor的黑白名单过滤
- 算法提高 淘淘的名单
- 邮件 黑名单 白名单 灰名单
- APK安装时的过滤方式:包名白名单、证书认证
- 白名单 white list
- 中国搜索引擎白名单
- 白名单(Whitelisting) 技术
- 移动白名单
- 活动白名单
- Python multiprocessing & scipy optimize leastsq线程安全问题
- Web开发分享qq、微信组件-百度分享
- dubbo修改登陆控制台密码
- 计算机网络--TCP为了维护安全和可靠所维护的七个定时器
- Bounding box regression详细解答
- 过滤白名单算法
- 2、linux下centOS系统分区
- C语言问题:为什么可以留着数组中第一维的参数不进行说明,但是其他维数必须说明呢?
- 抽象工厂模式的“开闭原则”倾斜性
- java 直接调用python脚本,并传递参数
- OpenGL蓝宝书源码学习(六)第三章——Smoother.cpp
- TypeScript迅速入门与应该知道
- Spark常见问题汇总
- (127)渲染概述