【发布时间】:2012-09-19 15:52:34
【问题描述】:
我们有一个有趣的挑战。我们必须控制对驻留在“bins”中的数据的访问。可能会有数十万个“垃圾箱”。对每个垃圾箱的访问都是单独控制的,但这些限制可以而且可能会重叠。我们正在考虑为每个 bin 分配位掩码中的位置(1、2、3、4 等)。
然后,当用户登录系统时,我们会查看他的安全属性并确定允许他查看哪些 bin。使用该信息,我们为该用户构建了一个位掩码,其中“设置”位对应于他允许查看的 bin 的标识符。所以如果他能看到 bin 1、3 和 4,他的位掩码就是 1101。
所以当用户搜索数据时,我们可以查看返回行的 bin 索引,看看他的位掩码上是否设置了该位。如果他的位掩码设置了该位,我们让他看到该行。我们计划在 Java 中将位掩码存储为 BigInteger。
我的问题是:假设索引号不会比 Integer.MAX_INT 大,BigInteger 位掩码是否会扩展到数十万位位置?在 n 可能很大(例如 874,837)的情况下运行 BigInteger.isBitSet(n) 是否需要永远?创建这样的BigInteger 需要永远吗?
其次:如果您有其他方法,我很乐意听到。
【问题讨论】:
-
可能是BitSet?
-
也许有不同的解决方案?您已经在说您的解决方案无法扩展。大量内存位图 +(希望)大量用户 = 坏主意。
-
@Banthar 终于用于
BitSet...BitSet的最大问题(我认为)是几乎没有方法可以与BitSet相互转换,因此它是没用那么多 - 我上次查看 Java API 时使用了零次。 -
@Augusto,我没有说它不能扩展。我测试了多达 2,000 个位掩码位置,并且能够在 0.2 秒内运行一百万个随机是/否(是位 x 设置)测试。我想我应该为数百万位的位置做一些性能测试。 (对我来说是-1)。我的问题更倾向于使用 BigInteger 来做这件事有多糟糕。它是记忆猪吗?它是否在性能下降的地方达到顶峰?等
-
@owlstead,它在 Java 7 中得到了改进。例如,您现在可以从字节数组创建
BitSet。
标签: java biginteger bitmask