我正在开发一个函数,它接受一系列少于 255 个字符的权限字符串并将它们分配给一个实体。分配的每个字符串都是唯一的,但是有太多的字符串,以至于将它们放入数组中,序列化它们并插入数据库,稍后将它们拉出并反序列化它们或在每次有负载时从查询中重新计算会导致延迟问题。尤其是继承权限。
所以我在考虑获取字符串,从中生成一个掩码,然后将其放入权限 glob 中。随着更多权限的添加,继续将它们添加到 glob 中。然后,当您需要根据 glob 验证权限和字符串时。
问题是如何生成掩码。起初我只是想对字符串进行哈希处理以获得一个独特的掩码,但这是可以想象的,但我不知道有多大可能,随着更多的哈希值被或运算到 glob 上,有可能以这样的方式填充 glob并以他们没有的权限进行测试,但返回一个真实值。
if($glob&&$test == $test)
另一个选项是对权限字符串进行自动编号,并将它们的掩码设置为 2^auto-number。但这会将权限字符串的数量限制在 64ish 左右。
我真正想要的是某种 glob,我可以从数据库中提取一次并将其与用户相关联。然后根据表示权限集的字符串或关联值测试该 glob。
最佳答案
我找到了一个有趣的解决方案,但我不确定它在逻辑上是否正确,因为我不太熟悉 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;}
输出:
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
所以这是可行的,但我会如何看待碰撞?使用 key3a 我展示了一个字符串,该字符串具有与其他键中的字符匹配的字符的组合,我可以得到误报。但是我可以通过对权限字符串的严格规则来绕过它吗?每种资源类型都被命名,并且每种资源类型都具有有限数量的关联权限。所以像“博客......写帖子”,“博客......发布帖子”,“博客......适度发布”,“播客......上传”,“播客...... ...Publish"以补偿不断增加的冲突概率,因为字符串长度对 PHP 的速度几乎没有影响。
关于php - 如何按位比较字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/942540/