如何将一行整数压缩为更短的内容?例如:输入:'1 2 4 9 8 5 2 7 6 2 3 4' -> 算法 -> 输出:'X Y Z',并且可以反向操作吗?('X Y Z' ->'1 2 4 9 8 5 2 7 6 2 3 4')。输入最多包含12个数字,仅限数字。输出可以是字母数字组合,最多3-4位。
谢谢。
编辑:每个输入数字0-9;输出0-9a-Z
如何将一行整数压缩为更短的内容?例如:输入:'1 2 4 9 8 5 2 7 6 2 3 4' -> 算法 -> 输出:'X Y Z',并且可以反向操作吗?('X Y Z' ->'1 2 4 9 8 5 2 7 6 2 3 4')。输入最多包含12个数字,仅限数字。输出可以是字母数字组合,最多3-4位。
谢谢。
编辑:每个输入数字0-9;输出0-9a-Z
除非您的输入来自特定域,其中许多输入是不太可能/不可接受的-否则您无法执行此操作。
您可以使用4个字母数字字符编码约 62^4~=1.4*10^7
种不同的系列。 另一方面,12位数字的输入可以具有10 ^ 12个可能的不同输入。
根据 鸽巢原理 - 必须存在映射到相同输入的2个“压缩”。
但是,由于您应该需要重新创建原始序列,因此您无法区分两个相同的压缩。
因此不存在这样的压缩。
事实上,要将12位数字压缩为4个字符,您需要使用1000大小的字符字母表:
x^4 = 10^12, x>0
x = 1000
[0-9A-Z]
,则有36个可用字符。每个字符可以编码log_2(36)=5.1位。因此,编码您的40位需要8个字母数字字符。Input: 1 2 4 9 8 5 2 7 6 2 3 4
One number: 124985276234
Binary: 1110100011001101100111111011101001010
Grouped: 11101 00011001 10110011 11110111 01001010
ASCII: <GS><EM>��J
类似讨论 压缩一组大整数
$val = pack('H*', "124985276234");
echo '#'. $val . '#';
print_r(unpack('H*', $val));
die;
#Issue
00011001 => 25
11001 => 25
set_time_limit(0);
ini_set('memory_limit', '5000M');
ini_set("max_execution_time",0);
$collision = [];
$err = [];
for ($i=0; $i < 9000000; $i++) {
$packed = pack('H*', $i);
$unpacked = unpack('H*', $packed)[1];
if ( array_key_exists($i, $collision) ) {
die("Collision:". $i .' !!!!'. $packed .'!!!!'. $unpacked);
}
if ( $i != $unpacked ) {
$e = "Collision2:". $i .' !!!!'. $packed .'!!!!'. $unpacked . "\n";
#echo $e;
$err[] = $e;
}
$collision[] = $packed;
#echo '#'. $i .'#' . $unpacked . '#' . $unpacked . "#\n";
}