- lgsun592
- 等级: 初级会员
- 性别:
- 文章: 112
- 积分: 70
- 来自: 上海
|
问题:
现在有N多授权用户(id,name...),如何判断某用户(guest)是否有权限呢?id是整型且唯一。
我想到的解决方案是将授权用户id放到一个集合中,然后调用list.contains(guest.id)方法。
今天看到一个比较特别的方式,将验证部分整理如下:
public class TestInteger {
public static void main(String[] args) {
Random random = new Random();
List<Integer> list = new ArrayList<Integer>();
// 使用BigInteger 作为 id 集合
BigInteger ids = BigInteger.ZERO;
for (int i = 0; i < 10; i++) {
int id = random.nextInt(10);
list.add(id);
// 将id放入BigInteger
ids = ids.or(ZERO.setBit(id));
}
// 判断id是否存在
for (Integer id : list) {
System.out.println("Collection.contains( "+id+" )= " + ids.testBit(id));
}
}
}
缺点:只能用于验证,无法列表授权用户id
优点:会比将所有id放到集合中,然后调用contains方法速度快吗 ?欢迎补充.
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
返回顶楼 |
|
|
- chinaagan
- 等级: 初级会员
- 性别:
- 文章: 44
- 积分: 30
- 来自: 重庆
|
用红黑树吧,查找比较快。而且你这种方式感觉怪怪的,占用内存比较大?
|
返回顶楼 |
|
|
- OpenMind
- 等级:
- 性别:
- 文章: 52
- 积分: 170
- 来自: 深圳
|
Java里面有个BitSet类,就是干你说的这个事情的,应该更好吧。
|
返回顶楼 |
|
|
- mike.liu
- 等级: 初级会员
- 性别:
- 文章: 22
- 积分: 30
- 来自: 深圳
|
为什么一定要用BigDecimal,如果只有10个bit的话,用int足矣,就有32个bit可用。 int ids = 0;
用(ids & id)!=0来判断,应该比testBit来得直接高效。
|
返回顶楼 |
|
|
- 池中物
- 等级: 初级会员
- 性别:
- 文章: 104
- 积分: 40
- 来自: 杭州
|
发表时间:2013-06-13
最后修改:2013-06-13
权限, 1, 2, 4, 8, 16..........
用一个字段x表示
是否包含权限y: x & y > 0
设置权限y: x |= y
|
返回顶楼 |
|
|
- realvalkyrie
- 等级: 初级会员
- 性别:
- 文章: 21
- 积分: 30
- 来自: 杭州
|
java.util.bitset
1<<n & x 就是查询 1<<n | x 就是设置
|
返回顶楼 |
|
|
- vanceinfo_xuefei
- 等级: 初级会员
- 性别:
- 文章: 4
- 积分: 30
- 来自: 南京
|
红黑树是啥
|
返回顶楼 |
|
|
- dohkoos
- 等级:
- 文章: 238
- 积分: 236
- 来自: 北京
|
BitSet
|
返回顶楼 |
|
|
- atomduan
- 等级: 初级会员
- 性别:
- 文章: 23
- 积分: 30
- 来自: 北京
|
用hashmap不好么?
|
返回顶楼 |
|
|
- yuechen323
- 等级: 初级会员
- 性别:
- 文章: 29
- 积分: 50
- 来自: 北京
|
一般不都是登录成功后,在session保存当前用户的对象吗?比如CurrentUser对象,而CurrentUser对象有诸如userId,userName等属性,同时也会有权限或者角色集合的属性比如:List<String> userRoles的属性。当你在判断用户能不能看到按钮或者进行一个操作的时候,就用这个操作或按钮对应的权限privId去当前用户的userRoles里面去找,看是否包含来判断用户是否有权限; 但是有个缺点就是由于是存在session中,用户的权限如果修改了,就必须重新登录,但是这样查询速度是很快的,因为不用每次都要重新查询用户有没有这个权限。当然用户是不知道什么时候需要重新登录的,所以需要消息通知的机制来告知用户。 如果不能忍受用户需要重新登录,但是仍然要速度很快的查询速度,则可以使用Ldap而不是数据库来存储用户权限信息(比如IBM的TIM/TAM),则速度是很快的。 不过具我多年的经验,每次判断用户有没有权限而查询数据库不会造成太大的压力,前提是SQL要写好,索引建好,表如果太大了用分区表,或者索引组织表。 我想lz也是做企业开发的,你说的这点性能开销根本不算什么,就按照最基本的list.contains就足够了,如果复杂点的就用apache的common-collections里面的方法去实现,性能肯定比你自己写的好点。如果你整个什么位运算符还什么与或非的破玩意的话,将来维护是大麻烦,谁接手都会问候你祖宗18代的。程序优化和维护是要做到平衡的。我觉得google搜索的那些编写java提高性能的方法,以及effective java那本书里面写到的提高java程序性能的方法基本就够用了,全都会了,你就已经超过了60%的人了。
|
返回顶楼 |
|
|