权限算法
时间:2008-07-02
来源:互联网
复制PHP内容到剪贴板
<?
//权限id:删除=0;添加=1;修改=2;查看=3;移动=4;
$user1 = pow(2,0)+pow(2,3); //只有删除、查看权限
$user2 = pow(2,4); //只有移动权限
//echo $user1;
$p = pow(2,4); //判断移动权限 4
if($p&$user2) //如果大于0有权限,否则没有权限
{
echo '有权限';
}
else
{
echo '无权限';
}
?>
此程序有点就是快PHP代码:
<?
//权限id:删除=0;添加=1;修改=2;查看=3;移动=4;
$user1 = pow(2,0)+pow(2,3); //只有删除、查看权限
$user2 = pow(2,4); //只有移动权限
//echo $user1;
$p = pow(2,4); //判断移动权限 4
if($p&$user2) //如果大于0有权限,否则没有权限
{
echo '有权限';
}
else
{
echo '无权限';
}
?>
[ 本帖最后由 wz_910 于 2008-7-1 17:47 编辑 ]
作者: wz_910 发布时间: 2008-07-01
1 << 0 | 1 << 3 ?
1 << 4?
1 << 4?
作者: ShiningRay 发布时间: 2008-07-01
原理:
位与运算,顾名思义就是对位进行与运算:
以上面的式子为例:purview & 2^3 也就是 28&8
将它们化成二进制有
11100
& 01000
-------------------
01000 == 8(十进制) == 2^3
同理,如果要验证是否有删除A---0的权限
可以用:purview &((int)Math.pow(2,0));
即:
11100
& 00001
------------------------
00000 == 0(十进制) != 2^0
这种算法的一个优点是速度快。可以同时处理N个权限
如果想验证是否同时有删除A---0和删除B---3的权限
可以用purview&(2^0+2^3)==(2^0+2^3)?true:false;
设置多角色用户。根据权限值判断用户的角色。。。
位与运算,顾名思义就是对位进行与运算:
以上面的式子为例:purview & 2^3 也就是 28&8
将它们化成二进制有
11100
& 01000
-------------------
01000 == 8(十进制) == 2^3
同理,如果要验证是否有删除A---0的权限
可以用:purview &((int)Math.pow(2,0));
即:
11100
& 00001
------------------------
00000 == 0(十进制) != 2^0
这种算法的一个优点是速度快。可以同时处理N个权限
如果想验证是否同时有删除A---0和删除B---3的权限
可以用purview&(2^0+2^3)==(2^0+2^3)?true:false;
设置多角色用户。根据权限值判断用户的角色。。。
作者: wz_910 发布时间: 2008-07-03
几点注意事项:首先,一个系统可能有很多的操作,因此,请建立数据字典,以便查阅,修改时使用。其次,如果用数据库储存用户权限,请注意数值的有效范围。操作权限值请用唯一的整数!
作者: wz_910 发布时间: 2008-07-03
复制PHP内容到剪贴板
define('PATTERN_MODE_STRING', 2);
function bitToArray($data, $ruleArr, $mode = PATTERN_MODE_INT)
{
$varData = array();
if($mode == PATTERN_MODE_INT)
{
$usedBit = 0;
for($i = 0; $i < Count($ruleArr); $i++)
{
if($ruleArr[$i] <= 0 ) continue;
$turnData = pow(2, $ruleArr[$i]) - 1 << $usedBit & $data;
$varData[$i] = $turnData >> $usedBit;
$usedBit += $ruleArr[$i];
}
}
else
{
for($i = 0, $cnt = Count($ruleArr); $i < $cnt; $i++)
{
$varData[$i] = substr($data, $i, $ruleArr[$i]);
}
}
return $varData;
}
function arrayToBit($data, $ruleArr, $mode = PATTERN_MODE_INT)
{
$rslt = '';
if($mode == PATTERN_MODE_INT)
{
$usedBit = 0;
$rslt = 0;
for($i = 0; $i < Count($ruleArr); $i++)
{
if($ruleArr[$i] <= 0 ) continue;
if(!$data[$i]) $data[$i] = 0;
$rslt |= $data[$i] << $usedBit;
$usedBit += $ruleArr[$i];
}
}
else
{
for($i = 0, $cnt = Count($ruleArr); $i < $cnt; $i++)
{
$rslt .= sprintf('%0' . $ruleArr[$i] . 's', $data[$i]);
}
}
return $rslt;
}
$data 部分为数据, $ruleArr为规则PHP代码:
define('PATTERN_MODE_INT', 1);define('PATTERN_MODE_STRING', 2);
function bitToArray($data, $ruleArr, $mode = PATTERN_MODE_INT)
{
$varData = array();
if($mode == PATTERN_MODE_INT)
{
$usedBit = 0;
for($i = 0; $i < Count($ruleArr); $i++)
{
if($ruleArr[$i] <= 0 ) continue;
$turnData = pow(2, $ruleArr[$i]) - 1 << $usedBit & $data;
$varData[$i] = $turnData >> $usedBit;
$usedBit += $ruleArr[$i];
}
}
else
{
for($i = 0, $cnt = Count($ruleArr); $i < $cnt; $i++)
{
$varData[$i] = substr($data, $i, $ruleArr[$i]);
}
}
return $varData;
}
function arrayToBit($data, $ruleArr, $mode = PATTERN_MODE_INT)
{
$rslt = '';
if($mode == PATTERN_MODE_INT)
{
$usedBit = 0;
$rslt = 0;
for($i = 0; $i < Count($ruleArr); $i++)
{
if($ruleArr[$i] <= 0 ) continue;
if(!$data[$i]) $data[$i] = 0;
$rslt |= $data[$i] << $usedBit;
$usedBit += $ruleArr[$i];
}
}
else
{
for($i = 0, $cnt = Count($ruleArr); $i < $cnt; $i++)
{
$rslt .= sprintf('%0' . $ruleArr[$i] . 's', $data[$i]);
}
}
return $rslt;
}
如: 11011 调用 bitToArray('11011', array(1,1,1,1,1))
结果:
array(
0 => 1
1 => 1,
2 => 0,
........
反向用 arrayToBit 用来保存到存储器或数据库中.
对几位代表什么可定义常量:
如:
define(PRIV_ADD_USER, 0) //第一位
define(PRIV_DEL_USER, 1) //第二位
设 $p = bitToArray($result[$field], $rule);
那可以判定:
if($p[PRIV_ADD_USER])
{
//有权限;
}
else
{
//无权限
}
上面两个函数可以支持 整形, 字符形两种模式.
如 11011 用整形,结果就是 27, 数据库中值为27, 用字符形保存到数据库中就是 "11011"
整形使用位运算, 速度快, 但只支持 32种权限
字符形只受字符长度限制, 速度略慢于整形.
作者: 帅的像人渣 发布时间: 2008-07-03
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28