论坛首页 Java企业应用论坛

看到一段很有新意的java代码

浏览 10858 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-06-10  

问题:

       现在有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方法速度快吗 ?欢迎补充.

 

   发表时间:2013-06-11  
用红黑树吧,查找比较快。而且你这种方式感觉怪怪的,占用内存比较大?
0 请登录后投票
   发表时间:2013-06-12  
Java里面有个BitSet类,就是干你说的这个事情的,应该更好吧。
0 请登录后投票
   发表时间:2013-06-13  
为什么一定要用BigDecimal,如果只有10个bit的话,用int足矣,就有32个bit可用。
int ids = 0;

用(ids & id)!=0来判断,应该比testBit来得直接高效。
0 请登录后投票
   发表时间:2013-06-13   最后修改:2013-06-13
权限, 1, 2, 4, 8, 16..........
用一个字段x表示
是否包含权限y:    x & y > 0
设置权限y:    x |= y
0 请登录后投票
   发表时间:2013-06-13  
java.util.bitset

1<<n & x 就是查询
1<<n | x 就是设置
1 请登录后投票
   发表时间:2013-06-14  
红黑树是啥   
0 请登录后投票
   发表时间:2013-06-14  
BitSet
0 请登录后投票
   发表时间:2013-06-15  
用hashmap不好么?
0 请登录后投票
   发表时间:2013-06-16  
一般不都是登录成功后,在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%的人了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics