我正在构建一个系统,在这个系统中,我需要为用户分配特定(个人)资产的访问权限。这些资产(可能有数以万计)。
我想用按位比较来实现,比如,如果用户能够访问资产1和2,则存储3的值,访问1、2和3的值为7,等等。
访问不一定是连续的,因此用户可以很容易地访问资产10、12和24324。
我很快就遇到了一个问题,在使用比特时,服务器不会获取超过第63位的资产,所以很明显,我要么误解了什么,要么比特是存储此类信息的愚蠢方式。
我的代码运行在64位Linux系统上,它是(显然只是为了测试目的,只是为了发现这样的限制):
<?php
$bitwise = $_GET['bitwise'];
if (isset($bitwise)) {
echo "<br/>bitwise input: ";
echo $bitwise;
$bitcount = 0;
for ($i=1;$i<=$bitwise;$i*=2) {
if (($i & $bitwise) > 0) {
$bitcount++;
echo "<br/>{$bitcount}: " . $i . " is in " . $bitwise;
}
}
}?>
我通过查询字符串输入测试值。但是,不管我输入了什么值,我可以得到的最大计数是63。
所以,我的问题是:这仅仅是因为我用了按位进行比较,而这些比较并不理想(我的理论),还是我的实现是错的呢?
我的下一个解决方案是将“位”存储在数组中,因此,如果有人能够访问资产1、2和3,我会将他们的列表存储为1,2,3。不太可能有人拥有超过100种特定资产的权限。这样做合理吗?我意识到这在一定程度上使这个问题进入了值得讨论的领域,但希望它仍然足够具体。
当然,如果服务器必须同时为大量客户端提供服务,那么派拉蒙关注的是性能。
(如果适用,请原谅错误的术语,希望我的意思是清楚的)。
发布于 2014-02-06 18:36:36
这是标准行为- on 64位编译的PHP,整数的最大长度为64位。虽然它温暖了我的秘密灰胡子心,如果你有超过64个不同的角色,一个按位的解决方案是错误的访问控制。
还有两件事值得一提。
首先,出于性能原因,这样做对web应用程序来说可能是一个过早的优化。ACL查找在很长一段时间内都不会成为系统的瓶颈。此外,考虑到该语言的动态类型特性,不清楚按位运算符是否提供了那么多PHP性能好处。
其次,你被限制在63位的原因是因为PHP (似乎?)使用二人恭维实现有符号整数。最后一位代表正数或负数。我问这个问题关于前一段时间按位的NOT,这就是为什么这个问题引起了我的注意。
https://stackoverflow.com/questions/21609144
复制相似问题