我有必要将许多号码(我可以决定哪些号码)存储为单个唯一号码,我应该能够从中检索原始号码。
我已经知道有两种方法可以做到这一点:
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 的幂并对每个值求和
但这两种方法成长得很快(第一种方法比第二种方法快),并且使用素数需要我有很多素数。
例如,当您有一千个值时,是否有其他方法可以有效地完成此操作?
最佳答案
如果您要存储基数 10 的数字,则可以通过基数 11 的数字进行转换。随着基数的增加,你就有了一个额外的“数字”。使用该数字作为分隔符。因此,三个以 10 为基数的数字“10, 42, 457”变成“10A42A457”:一个以 11 为基数的数字(以“A”作为附加数字)。
无论原始数字采用什么基数,请将基数增加 1 并连接,使用多余的数字作为分隔符。这将为您提供增加基数中的一个数字。
该单个数字可以存储在您认为方便的任何数字基数中:例如二进制、十进制或十六进制。
要检索原始数字,只需转换为基数 11(或其他)并用分隔符替换多余的数字。
预计到达时间:您不必使用基数 11。单个数字“10A42A457”也是有效的十六进制数,因此可以使用 11 或以上的任何基数。十六进制可能比 11 进制更容易使用。
关于php - 将多个数字存储为单个唯一数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44346399/