Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将大整数编码/压缩为字母数字值_Php_Encoding - Fatal编程技术网

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

Php 将大整数编码/压缩为字母数字值,php,encoding,Php,Encoding,我有一个非常大的12-14位数的整数,我想将其加密/压缩为字母数字值,以便稍后可以从字母数字值恢复该整数。我尝试使用62个基数转换这个整数,并尝试将这些值映射到a-zA-Z0-9,但由此生成的值有7个字符长。这个长度仍然足够长,我想转换为大约4-5个字符 是否有一种通用的方法来实现这一点,或者有某种方法可以实现这一点,以便恢复整数仍然是可能的?我在这里问数学方面的问题,但我会用PHP编程,最近我开始用PHP编程 编辑: 我在考虑分配一个掩蔽位,并以某种方式使用它来生成较少的字符数。我意识到范围是

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

是否有一种通用的方法来实现这一点,或者有某种方法可以实现这一点,以便恢复整数仍然是可能的?我在这里问数学方面的问题,但我会用PHP编程,最近我开始用PHP编程

编辑:
我在考虑分配一个掩蔽位,并以某种方式使用它来生成较少的字符数。我意识到范围是不够的,这就是我专注于使用数学技巧或表示方式的原因。62进制是我已经应用过的一个想法,但还没有解决。

14位十进制数字可以表示1000000000000个值(1014)。
62个字符的字母表中的5个字符可以表示916132832个值(625)

不能将14位数字的等效值填充到5个字符的基数62字符串中。不可能唯一地表达每个可能的值。看见即使是带有7个字符的基64也不够(只有4398046511104个可能的值)。事实上,如果你的目标是一个5个字符的短字符串,你就需要使用一个631的基本字母表(6315=100033806792151)来进行补偿

即使是压缩也帮不了你。这意味着两个或多个数字需要压缩为同一个压缩字符串(因为没有足够的可能的唯一压缩值),这从逻辑上来说意味着不可能将它们解压缩为两个不同的值


要非常简单地说明这一点:假设我的字母表和目标“字符串长度”由一位组成。这一位可以是
0
1
。它可以表示两个唯一的可能值。假设我有一个压缩算法,它把所有的东西压缩成一个比特。。。我怎么可能用两个可能的值从这一位中解压1000000000000个唯一的值呢?如果你解决了这个问题,带宽和存储问题将立即消失,你将成为一个亿万富翁。

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


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

对于95个可打印ASCII字符,您可以切换到基本95编码,而不是62:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
这是非常好的压缩。所以从长度12到6。如果压缩的目的是通过使用JSON节省带宽,那么base 92可以是一个不错的选择(不包括在JSON中转义的
“,\,/

当然,你可以得到更好的压缩,但付出的代价是更大的字母表。只需用符号数替换上面公式中的95即可


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

您真的需要加密吗?还是只需要压缩?加密不能确保生成的值比前一个值少个字符。但是如果re是一种算法,我会很感激的。你唯一的选择是使用一个更大的字母表。不是以62为基数,而是64,甚至更多,这将包括“特殊字符”“。您只是遇到了鸽子洞原则:您无法在字符串中表达比字母表大小^string length更多的可能值。如果你想要更短的字符串,你必须增加字母表。那么你是说以64为基数,在我的例子中是以62为基数,是减少字符数的最佳选择。是否没有算法/数学方法来转换?我相信一定有某种数学方法可以做到这一点。加密!=编码。Base 64(或Base 62)将编码,但不加密。使用加密,以便未经授权的人员无法查看数据。听起来你想通过编码来压缩。对吗?对。。亿万富翁。但是你不会收到10000000000美元,你只会得到1美元,因为这个“压缩版本”在银行账户上的转账速度更快:):)这只是信息理论突破的一个有趣的应用!具有64个字符的字母表可以表示每个字符6位,而具有8个字符的字母表只能表示3位。因此,8字符表达式可以压缩到64字符大小的一半。我看不出有什么问题。为什么这样的压缩是不可能的?@Dmitri我想我已经解释过了。。。OP试图将无法容纳所有可能值的消息大小作为目标。是的,64个字符的字母表中长度为4的消息与8个字符的字母表中长度为8的消息相同(64^4==8^8)。这是一个简单的基转换,而不是压缩。但以任何标准衡量,62^5远小于10^14。无法将10^14个值无损转换或压缩为62^5。是的,基本转换。但它确实做到了——将长整数字符串压缩成较短的字母数字字符串。那不是OP的要求吗?为什么这不是压缩?
Y = X * log 10/ log 95 = roughly X / 2