如何将权限字符串数组转换为紧凑唯一整数?
权限数组转紧凑唯一整数的高效方案
核心思路:先给权限分配唯一标识,再编码为紧凑整数
方案1:字典映射+位掩码(改进版)
- 第一步:给每个权限字符串分配唯一整数ID,比如维护一张
permission_defs表:
ID可以用自增序列,也可以按权限层级编码(比如| id | permission | |-----|---------------------| | 1 | role.users.view | | 2 | role.users.manage | | 3 | role.users.delete |role=1、users=2、view=1→1*1000+2*100+1=1201,兼顾可读性)。 - 第二步:将用户的权限ID集合转为位掩码整数。比如用户拥有ID1、3,对应二进制
101,转十进制为5。若权限数量超过64个,直接用数据库支持的任意精度整数类型(如PostgreSQL的NUMERIC、MySQL的DECIMAL)存储,这类类型能存超长整数,且体积远小于字符串数组。 - 优势:编码解码速度极快,权限校验直接用位运算
(mask & (1 << id)) != 0完成,性能最优。
方案2:字典映射+可变长度整数编码
如果觉得位掩码的大整数仍不够紧凑,可采用此方案:
- 第一步:同样给权限分配唯一ID,将用户的权限ID按从小到大排序。
- 第二步:对排序后的ID做差值编码(如ID序列
[1,3,5],差值为[1,2,2]),再用可变长度编码(如Varint)打包成字节流,最后转成十进制整数(或把字节流转十六进制再转十进制)。 - 优势:用户权限数量较少时,编码后的整数比位掩码更短,存储更紧凑。
方案3:完美哈希映射
若不想维护权限ID字典,可使用完美哈希函数给每个权限字符串生成唯一整数:
- 提前针对所有权限设计无冲突的哈希算法(如多项式哈希),直接将权限字符串转为唯一整数,再把用户的权限整数集合用位掩码或上述编码方式转成单个大整数。
- 优势:无需维护ID字典,直接操作字符串;缺点是新增权限时需重新验证哈希无冲突。
关键注意事项
- 编码解码逻辑需保持一致,比如排序规则、ID分配规则不能随意修改。
- 若权限会频繁新增,优先选择自增ID的字典映射方案,扩展性最佳。
- 数据库存储时优先选用支持任意精度整数的类型,避免溢出问题。
内容的提问来源于stack exchange,提问作者Radu
相关产品推荐
相关产品推荐

