我正在处理一个函数,它接受一系列权限字符串,少于255个字符并将它们分配给一个实体。分配的每个字符串都是唯一的,但有很多将它们放入一个数组中,将它们序列化并推入数据库并稍后将它们拉出来并对它们进行反序列化或每次有负载时从查询中重新计算都会导致延迟问题。特别是继承权限。
所以我考虑接受字符串,从中生成一个掩码,然后OR'ing到权限glob。随着更多权限的添加,继续将它们添加到glob中。然后当你需要验证权限和针对glob的字符串时。
问题是如何生成蒙版。起初我想的是只是为一个独特的掩码散列字符串,但是可以想象,但是我不知道有多少可能,因为更多的哈希值被OR加到了glob上,这样填充glob的潜力和AND测试的方式,他们没有,但返回一个真正的值。
if($glob&&$test == $test)
另一个选项是自动编号权限字符串,并使其掩码为2 ^ auto-number。但这会将权限字符串的数量限制在64.左右。
我真正想要的是某种类型的小球,我可以从数据库中取出一次并将其与用户关联起来。然后针对表示权限集的字符串或关联值测试该glob。
答案 0 :(得分:2)
我找到了一个有趣的解决方案,但我不确定它是否在逻辑上是正确的,因为我不太熟悉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,我展示了一个字符串,其中包含与其他键中的字符匹配的字符组合,我可以得到误报。但是我可以通过对权限字符串的严格规则来绕过它吗?每种资源类型都被命名,每种资源类型都具有有限数量的关联权限。所以像“博客....写帖子”,“博客...发布帖子”,“博客......温和帖子”,“播客.......上传”,“播客...... ...发布“以补偿不断增加的碰撞概率,因为字符串长度对PHP的速度影响不大。
答案 1 :(得分:1)
这里的基本思想是:
另一个选项是自动编号权限字符串,并使其掩码为2 ^ auto-number。但这会将权限字符串的数量限制在64.左右。
如果您的权限字符串真正彼此独立,那么,显然,无论您做什么,您都需要至少1位来存储是否存在权限。没有办法(它是1位实际的,独立的,信息)。
您的问题的一个可能解决方案是以紧凑的方式对权限进行编码(比如为每个人分配一个Int16),并将用户权限列表存储为其所有权限的二进制数组。这是丑陋的,但它会模糊地解决你的问题。根据数据库的不同,您可能实际上有某种类型的数组/集合列类型可供您使用。
答案 2 :(得分:0)
由于每个字符串都是唯一的,为什么不将它们从数据库加载到哈希表(或类似的)中并在用户会话期间缓存它们?