关于位运算在权限配置及类似场景中的应用
2015-08-20 10:57
405 查看
思考以下场景:一个对象(狭义地说,一个接口或实例,广义的说,一个注册服务,乃至一个抽象主体)需要注册分配任意个权限,权限已知,权限列表固定。
以往面对这样的场景,我第一个思路是为对象加入List权限成员。但是这种做法面临检索难的问题,每次检索一个权限都需要循环查询权限列表,时间效率低,比如下面一个demo。
最近在学习NIO的过程中,发现NIO类库中的权限常量定义很有意思:
public static final int OP_READ = 1<< 0;
public static final int OP_WRITE = 1<< 2;
……
运用的是位运算的方式。按照这种思路,上面的demo改成以下形式。
可见,检索效率大幅提高,随机的权限控制也变得十分简单。在与同事的技术交流中了解到,权限管理框架Shiro对于权限配置的思路也是运用位运算方式,代码的确十分高效。
以此记录。
2015-08-03
以往面对这样的场景,我第一个思路是为对象加入List权限成员。但是这种做法面临检索难的问题,每次检索一个权限都需要循环查询权限列表,时间效率低,比如下面一个demo。
import java.util.ArrayList; import java.util.List; enum AuthorityEnum{ AUTH_A(1),AUTH_B(2),AUTH(3); int enumId; AuthorityEnum(int enumId) { this.enumId = enumId; } } public class DemoAuthority { private List<AuthorityEnum> authorities = new ArrayList<AuthorityEnum>(); public void addAuthority(AuthorityEnum newEnum) { authorities.add(newEnum); } public boolean isAuthorityPermit(AuthorityEnum enumToCheck) { //循环查询权限列表,效率低 for(AuthorityEnum tmpEnum : authorities) { if(tmpEnum.equals(enumToCheck)) { return true; } } return false; } public static void main(String[] args) { DemoAuthority da = new DemoAuthority(); da.addAuthority(AuthorityEnum.AUTH_A); System.out.println("AUTH_A status:"+da.isAuthorityPermit(AuthorityEnum.AUTH_A)); System.out.println("AUTH_B status:"+da.isAuthorityPermit(AuthorityEnum.AUTH_B)); } }
最近在学习NIO的过程中,发现NIO类库中的权限常量定义很有意思:
public static final int OP_READ = 1<< 0;
public static final int OP_WRITE = 1<< 2;
……
运用的是位运算的方式。按照这种思路,上面的demo改成以下形式。
enum BitAuthorityEnum{ AUTH_A(1 << 0),AUTH_B(1 << 1),AUTH(1 << 2); int enumId; BitAuthorityEnum(int enumId) { this.enumId = enumId; } public int getId() { return enumId; } } public class DemoBitAuthority { int authorities = 0; public void addAuthority(BitAuthorityEnum newEnum) { //或运算加入权限 authorities |= newEnum.getId(); } public boolean isAuthorityPermit(BitAuthorityEnum enumToCheck) { //与运算匹配实现 return (authorities & enumToCheck.getId()) == enumToCheck.getId(); } public static void main(String[] args) { DemoBitAuthority da = new DemoBitAuthority(); da.addAuthority(BitAuthorityEnum.AUTH_A); System.out.println("AUTH_A status:"+da.isAuthorityPermit(BitAuthorityEnum.AUTH_A)); System.out.println("AUTH_B status:"+da.isAuthorityPermit(BitAuthorityEnum.AUTH_B)); } }
可见,检索效率大幅提高,随机的权限控制也变得十分简单。在与同事的技术交流中了解到,权限管理框架Shiro对于权限配置的思路也是运用位运算方式,代码的确十分高效。
以此记录。
2015-08-03
相关文章推荐
- Windows7下获得System权限问题解决方法
- 用一整天的时间安装postgreSQL NTFS权限
- 星外系统关于权限的综合说明
- 用vbs检查注册表项的访问权限的代码
- 使用位运算实现网页中的过滤、筛选功能实例
- sqlserver附加.mdf权限问题解决
- MongoDB系列教程(四):设置用户访问权限
- cacls命令设置文件及其文件夹权限的方法
- “SQL2000数据库”运行在普通用户下所需的权限
- 批处理设置文件访问权限的方法分享
- C#枚举中的位运算权限分配浅谈
- shell 基本计算、逻辑运算、位运算详解
- windows 权限之拒绝运行应用程序
- windows IIS权限经典设置教程
- Android用代码获取手机root之后的最高权限
- Java位运算和逻辑运算的区别实例
- IIS6.0的默认权限和用户权限设置小结
- 优秀程序员必须知道的20个位运算技巧
- VC判断进程是否具有administrator权限的方法