将字符串数组转换为单个整数



我正在尝试创建一个"权限";系统,我可以存储一个用户拥有的所有权限。目前,用户的所有权限都存储在数据库中的数组中:

[
'role.users.view',
'role.users.manage',
'role.users.delete'
...
]

但是,我创建的权限越多,数据库的大小就越大。因此,我希望能够将所有这些数组存储为唯一的字符串/整数/标识符,这允许我有效地将上面的数组转换为单个整数-假设上面的字符串数组变成了数字1290481294。我最初的想法是根据权限是开还是关来构造一个整数——结果是一个像10101010101这样的整数——但是这个数字也会变得非常长;所以我想找到一个更有效的方法。

我完全确定已经有一种现有的技术可以做到这一点,但我真的不知道它是如何命名的,也不知道我可以在哪里记录我对这个主题的看法。

tl;dr:我正在尝试将上面的字符串数组转换成一个尽可能短的整数。

如果你正在使用Python,你可以使用这个

all_permissions = [ # List of all permissions (prefarably unique)
'role.users.view',
'role.users.manage',
'role.users.delete',
'role.message.view',
'role.message.send',
'role.message.delete'
]
permission_flag = 1
permission_flags = {}
permission_lookup = {}
for i, permission in enumerate(all_permissions): # Initiate flags
permission_flags[permission] = permission_flag
permission_lookup[i] = permission
permission_flag *= 2
#all_permissions = [] # Clear all_permissions, we don't need it anymore
def function_a_1():
# Permissions to permission_identifier
permissions = [ # Old user permissions
'role.users.view',
'role.users.delete',
'role.users.delete'
]
permission_identifier = 0
for permission in permissions:
permission_identifier |= permission_flags[permission] # Bitwise or
return permission_identifier
def function_b_1():
# permission_identifier to Permissions
permissions = []
permission_identifier = 6
for permission, permission_flag in permission_flags.items(): # Initiate flags
if permission_identifier & permission_flag:
permissions.append(permission)
return permissions
def function_b_2():
# permission_identifier to Permissions
permissions = []
permission_identifier = 6
permission_index = 0
while permission_identifier:
if permission_identifier % 2:
permissions.append(all_permissions[permission_index])
permission_identifier //= 2
permission_index += 1
return permissions
print(function_a_1())
print(function_b_1())
print(function_b_2())
from timeit import repeat
loops = 1_000_000
count = 1
print(loops * min(repeat("function_b_1()", globals=globals(), repeat=loops, number=count)))
print(loops * min(repeat("function_b_2()", globals=globals(), repeat=loops, number=count)))

输出:

5
['role.users.manage', 'role.users.delete']
['role.users.manage', 'role.users.delete']
0.4998873919248581
0.3998866304755211

这是正确的,因为:

  • 2^0 + 2^2 = 1 + 4 = 5
  • 2^1 + 2^3 = 2 + 4 = 6

当用户角色较少时,最后一个函数可能更好

相关内容

  • 没有找到相关文章

最新更新