我正在建立一个系统,我需要为用户分配特定(个人)数量的资产。这些资产(可能数以万计)。
我想用按位比较来做这件事,所以如果用户可以访问资产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;
}
}
}
&GT;
我通过查询字符串输入测试值。但是,无论我输入什么值,我可以得到的最大数量是63。
所以,我的问题是:这只是因为我正在使用按位比较来解决他们不理想的事情(我的理论),还是我的实现错误?
我的下一个解决方案是将“位”存储在数组中,因此如果有人可以访问资产1,2和3,我会将其列表存储为[1,2,3]。人们不太可能访问超过一百个特定资产。这是一种合理的方法吗?我意识到这会把这个问题放在有待讨论的领域,但希望它仍然足够具体。
如果服务器必须同时为大量客户提供服务,那么当然,最重要的是性能。
(请原谅错误的术语,希望我的意思很明确。)
答案 0 :(得分:2)
这是标准行为 - 在64位编译的PHP上,整数的最大长度为64位。虽然它可以温暖我的秘密灰胡子心,但如果你有超过64种不同的角色,那么对于访问控制来说,一个按位解决方案是错误的。
另外两件值得一提的事。
首先,出于性能原因这样做可能是Web应用程序的过早优化。如果有的话,ACL查找在很长一段时间内不会成为系统的瓶颈。此外,鉴于语言的动态类型性质,不清楚按位运算符是否提供了如此多的PHP性能优势。
其次,你被限制在63位的原因是因为PHP(似乎?)使用Two's compliment来实现有符号整数。最后一位用于表示正数或负数。我曾经问过this question关于按位NOT
的问题,这就是为什么这个问题引起了我的注意。