Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何按位比较字符串_Php_Permissions_Bit Manipulation - Fatal编程技术网

Php 如何按位比较字符串

Php 如何按位比较字符串,php,permissions,bit-manipulation,Php,Permissions,Bit Manipulation,我正在处理一个函数,它接收一系列少于255个字符的权限字符串,并将它们分配给一个实体。分配的每个字符串都是唯一的,但数量如此之多,以至于每次加载时,将它们放入数组、序列化并推入数据库并将其取出、反序列化或从查询中重新计算都会导致延迟问题。特别是对于继承的权限 因此,我考虑使用字符串,从中生成一个掩码,或者将其放入权限glob。随着更多权限的添加,继续将其添加到全局。然后,当您需要根据glob验证权限和字符串时 问题是如何生成掩码。起初,我想对字符串进行散列以获得一个唯一的掩码,但是这是可以想象的

我正在处理一个函数,它接收一系列少于255个字符的权限字符串,并将它们分配给一个实体。分配的每个字符串都是唯一的,但数量如此之多,以至于每次加载时,将它们放入数组、序列化并推入数据库并将其取出、反序列化或从查询中重新计算都会导致延迟问题。特别是对于继承的权限

因此,我考虑使用字符串,从中生成一个掩码,或者将其放入权限glob。随着更多权限的添加,继续将其添加到全局。然后,当您需要根据glob验证权限和字符串时

问题是如何生成掩码。起初,我想对字符串进行散列以获得一个唯一的掩码,但是这是可以想象的,但我不知道有多大的可能性,随着更多的散列值被添加到glob上,填充glob的方式可能会使and和test在没有权限的情况下返回一个真实值

if($glob&&$test == $test)
另一个选项是只对权限字符串进行自动编号,并使其掩码为2^自动编号。但这将把权限字符串的数量限制在64个左右


我真正想要的是某种glob,我可以从数据库中取出一次,并将其与用户关联起来。然后根据表示权限集的字符串或关联值测试该glob。

既然每个字符串都是唯一的,为什么不将它们从数据库加载到哈希表(或类似文件)中一次,并在用户会话期间缓存它们呢?

这里的基本思想是:

另一个选项是只对权限字符串进行自动编号,并使其掩码为2^自动编号。但这将把权限字符串的数量限制在64个左右

如果您的权限字符串彼此真正独立,那么显然,无论您做什么,您都需要至少1位来存储权限是否存在。这是没有办法的(这是一点实际的、独立的信息)


一个可能的解决方案是以紧凑的方式对权限进行编码(比如为每个权限分配一个Int16),并将用户权限列表存储为其所有权限的二进制数组。这很难看,但它能模糊地解决你的问题。根据数据库的不同,实际上可能有某种数组/集合列类型可供使用。

我找到了一个有趣的解决方案,但我不确定它在逻辑上是否正确,因为我不太熟悉PHP如何处理字符串数据。我决定把所有的东西都切掉,不做任何散列、赋值或诸如此类的事情,只对字符串进行逐位运算。这似乎有效,但我不确定我是否能证明我的逻辑足够正确

$key1 = "Access to Black Box";
$key2 = "Managing Black Box";
$key3 = "Nothing too see here";
$key3a = "Nothingg B";
$key3b = "too see";
$glob = "";

$glob = $glob | $key1;
if(($glob & $key1) == $key1){echo "<p>Key one exists in glob: " . $glob;}

$glob = $glob | $key2;
if(($glob & $key2) == $key2){echo "<p>Key one exists in glob: " . $glob;}

if(($glob & $key3) == $key3){echo "<p>Key three exists in glob: " . $glob;}
else{echo "<p>Key three does not exists in glob: " . $glob;}

$glob = $glob | $key3;
if(($glob & $key3) == $key3){echo "<p>Key three exists in glob: " . $glob;}

if(($glob & $key3a) == $key3a){echo "<p>Key three a exists in glob: " . $glob;}

if(($glob & $key3b) == $key3b){echo "<p>Key three b exists in glob: " . $glob;} 
else{echo "<p>Key three b does not exists in glob: " . $glob;}
$key1=“访问黑盒”;
$key2=“管理黑盒”;
$key3=“此处无需太多内容”;
$key3a=“无任何B”;
$key3b=“太见”;
$glob=“”;
$glob=$glob |$key1;
如果(($glob&$key1)==$key1){echo“键1存在于glob:.$glob;}
$glob=$glob |$key2;
如果(($glob&$key2)=$key2){echo“键1存在于glob:.$glob;}
如果(($glob&$key3)=$key3){echo“键三存在于glob:.$glob;}
否则{echo“键三在glob中不存在:“.$glob;”
$glob=$glob |$key3;
如果(($glob&$key3)=$key3){echo“键三存在于glob:.$glob;}
如果(($glob&$key3a)=$key3a){echo“键三a存在于glob:.$glob;}
如果(($glob&$key3b)=$key3b){echo“键三b存在于glob:.$glob;}
否则{echo”键三b在glob中不存在:“.$glob;}
产出:

Key one exists in glob: Access to Black Box Key two exists in glob: Mcoew{nwobnmckkbox Key three does not exists in glob: Mcoew{nwobnmckkbox Key three exists in glob: Oomowoomsooboze Key three a exists in glob: Oomowoomsooboze Key three b does not exists in glob: Oomowoomsooboze 关键一点存在于glob中:访问黑盒 键2存在于glob中:Mcoew{nwobnmckkbox glob:Mcoew{nwobnmckkbox中不存在键3 关键三点存在于glob中:Oomowoomsooboze 关键的三个a存在于glob中:Oomowoomsooboze 键三b在glob中不存在:Oomowoomsooboze
这是可行的,但我应该从冲突的角度看什么呢?通过键3a,我展示了一个字符串,它的字符组合与其他键中的字符位置相匹配,我可以得到一个误报。但是我可以用权限字符串的严格规则来绕过它吗?每个资源类型都有名称,每个资源类型都有一个限制d相关权限的数量。例如“博客…写文章”,“博客…发布文章”,“博客…适度文章”,“播客…上传”,“播客…发布”由于字符串长度对PHP的速度几乎没有影响,为了补偿不断增加的冲突概率。

用户有权限字符串列表,组有权限字符串列表,用户可以属于多个组,组可以属于多个组。按照权限链封装所有权限每次会话启动都会导致登录后站点的第一次加载花费很长时间。由于权限在会话期间可能会发生更改,我需要一种快速的方法来重新计算要测试的权限,这种方法可以在每次页面加载时更新。啊,我明白了。就像windows ACL一样