编码/将大整数压缩为字母数字值

时间:2013-10-11 09:13:32

标签: php encoding

我有一个非常大的12-14位整数,我想将其加密/压缩为一个字母数字值,以便稍后可以从字母数字值中恢复整数。我尝试使用62 base转换此整数,并尝试将这些值映射到a-zA-Z0-9,但由此生成的值为7个字符长。这个长度仍然足够长,我想转换为大约4-5个字符。

是否有一般方法可以执行此操作或某些方法可以执行此操作,以便仍然可以恢复整数?我在这里问数学方面,但我会用PHP编程,最近我开始用php编程。

编辑:

我在考虑分配掩码位并以某种方式使用它来生成更少数量的Chars。我知道范围是不够的,这就是我专注于使用数学技巧或表达方式的原因。 62基础是我已经应用但尚未解决的想法。

3 个答案:

答案 0 :(得分:5)

14位十进制数字可表示100,000,000,000,000个值(10 14 ) 62个字符的5个字符可以表示916,132,832个值(62 5 )。

您不能将14位数字的等效数量的数字填充到5个字符的基本62字符串中。根本不可能唯一地表达每个可能的值。见http://en.wikipedia.org/wiki/Pigeonhole_principle。即使是具有7个字符的base 64也是不够的(仅有4,398,046,511,104个可能的值)。事实上,如果你的目标是一个5个字符的短字符串,你需要使用一个基本的631字母表来补偿(631 5 = 100,033,806,792,151)。

即使压缩也无济于事。这意味着需要将两个或更多个数字压缩到相同的压缩字符串(因为没有足够的可能唯一压缩值),这在逻辑上意味着无法将它们解压缩为两个不同的值。

为了简单说明这一点:说我的字母和目标“字符串长度”由一位组成。这一位可以是01。它可以表达2个唯一可能的值。假设我有一个压缩算法,可以将任何内容和所有内容压缩到这一位。 ...我怎么可能用两个可能的值从那一位解压缩100,000,000,000,000个唯一值?如果您解决了这个问题,带宽和存储问题会立即消失,您将成为亿万富翁。

答案 1 :(得分:2)

使用95个可打印的ASCII字符,您可以切换到base 95编码而不是62:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

这样一个长度为X的整数字符串可以压缩成长度Y base 95字符串,其中

Y = X * log 10/ log 95 = roughly X / 2

这是非常好的压缩。所以从长度1​​2开始,你可以降到6.如果压缩的目的是通过使用JSON来节省带宽,那么基数92可能是一个不错的选择(不包括在JSON中转义的",\,/)。

当然,您可以获得更好的压缩效果,但要付出的代价是更大的字母表。只需用符号数替换上述公式中的95.

除非你知道整数的结构。例如,如果它们有足够的零,您可以根据这些知识进行压缩,以获得更好的结果。

答案 2 :(得分:1)

因为鸽子原则你会得到一些被压缩的值和其他扩展的值。根本不可能创建压缩每个可能的输入字符串的压缩算法(例如,在您的情况下是您的数字)。

如果强制输出集的基数小于输入集的基数,则会发生冲突(即更多输入字符串被“压缩”到相同的压缩二进制字符串)。压缩算法应该是可逆的,对吗? :)