【发布时间】:2017-06-03 16:54:42
【问题描述】:
我有必要将许多数字(我可以决定哪些数字)存储为一个唯一的数字,我应该能够从中检索原始数字。
我已经知道两种方法:
1) 算术基本定理(素数)
假设我有 5 个值,我为每个值分配一个非 1 的素数
a = 2
b = 3
c = 5
d = 7
e = 13
如果我想存储 a、b 和 c,我可以将它们相乘2*3*5=30,并且我知道没有其他素数乘积可以是 30。然后检查一个值是否包含,例如,b,我需要做的就是30 % b == 0
2) 位掩码 就像 Linux 权限一样,使用 2 的幂并对每个值求和
但这两种方法发展迅速(第一种比第二种快),而且使用素数需要我有很多素数。
例如,当您拥有一千个值时,还有其他方法可以有效地做到这一点吗?
【问题讨论】:
-
你对这个问题有更多的背景吗?一般来说,它不能比位掩码选项更有效,因为在您的示例中,您将有
2^5可能性,这需要 5 位才能存储所有这些选项。但我很好奇哪里需要将它存储在一个数字中。 -
我需要通过 JWT(JSON Web 令牌)发送权限,因为我可以为同一个用户(大型应用程序)获得数百个权限,我想知道是否有一些方法可以编写它们以紧凑的方式避免发送大令牌。默认情况下,我将它们作为权限名称数组获取,所以我在考虑替代方案,ID 数组已经更好,但我想知道是否有更好的方法。如果令牌不能超过 64 位,我可能最终只会从令牌中删除权限
-
我对 JWT 不熟悉,但是对于数百个权限,您只需要数百位,可能不会很多?也许您可以找到一种不同的方式来存储这些位(例如多个 64 整数)并获得适合您的解决方案。
标签: php numbers primes bitmask