可逆字符串压缩PHP/C++;

可逆字符串压缩PHP/C++;,php,c++,algorithm,compression,obfuscation,Php,C++,Algorithm,Compression,Obfuscation,我想混淆一些短文本数据,并使这种压缩可以学习/记忆 我想在PHP中找到一个算法,把一个字符串(25个字符长)压缩成一个8字符字符串,然后在C++中可逆。 有人有algo名称或其他想法吗 < > >强>编辑< /强>:所有都是小写,有两个特写字符。< P>因为文本数据只包含小写字母和两个特殊字符,所以我们只有28个不同的字符要考虑。< /P> 我们可以利用位表示的特性来设计哈希函数。通过5位的所有可能组合,我们可以唯一地表示32个不同的符号。因此,为了表示28个不同的符号,每个符号只需要5位 a

我想混淆一些短文本数据,并使这种压缩可以学习/记忆

我想在PHP中找到一个算法,把一个字符串(25个字符长)压缩成一个8字符字符串,然后在C++中可逆。 有人有algo名称或其他想法吗


< > >强>编辑< /强>:所有都是小写,有两个特写字符。

< P>因为文本数据只包含小写字母和两个特殊字符,所以我们只有28个不同的字符要考虑。< /P> 我们可以利用位表示的特性来设计哈希函数。通过5位的所有可能组合,我们可以唯一地表示32个不同的符号。因此,为了表示28个不同的符号,每个符号只需要5位

a => 00000
b => 00001
c => 00010
......
......
......
y => 11000
z => 11001
special-character-1 => 11010
special-character-2 => 11011
使用这种编码方案,我们只需要25*5=125位来表示完整的文本数据,即125/8~16字节或16个字符(抱歉,它不是8个字符)

现在,您可以通过应用反向映射从这个16个字符的散列中检索实际字符串

如果你对16个字符的可逆哈希感到满意,我可以提供C++实现。

不可能。

如果我们假设原始字符串只包含字母A-Z,则有2625个≈ 4.25 x 1037(420亿)个可能的输入字符串

如果我们慷慨地允许8个字符的输出包含任何字母、大写或小写或数字(总共26+26+10=62个字符),则有628个字符≈ 2.18 x 1014(2.18亿)可能的产出


这大约是1023倍!顺便说一句,您要求的压缩方案是不可能的——可能的输入字符串比输出多出许多倍,因此无法可逆地将每个输入字符串转换为输出并返回。

文本数据由什么组成?小写、大写、数字?还有其他角色吗?一切都是低格的,有一些特殊角色。有多少特殊角色?我这样问是因为设计编码方案是必需的。只有两个特殊字符会被使用。你有没有试过两次压缩ZIP档案?您可能已经注意到,压缩已压缩的存档不会进一步减小其大小。同样适用于字符串,始终存在无法进一步压缩的字符串。这意味着:您的平均压缩率只能为25到8个字符,而且总会有例外。当然,除非压缩实际上意味着用更大的字母表编码,每个字符存储更多的信息。好主意。但即使我可以模拟固定长度的输出字符串,16个字符实在太难记忆了。。。更不用说,在我看来,将其编码为5位将很难在输出中显示字符。是的,遗憾的是,一些生成的字符将不是ASCII或可显示的,但它肯定会工作。我需要这种压缩可记忆。16字节被认为是可记忆的,因为人们通常会记住MD5哈希。你会有多少个散列?用户只需要记住一个散列,但要求记住16个字符对他们来说是很困难的。我想小于10就可以了,8就可以了。所以像algo一样的CRC-16编码不会产生唯一的输出字符串吗?@Bloo2-Nope!例如,
“plumless”
“buckeroo”
都有CRC32 0x4ddb0c25。(这是CRC32,不是CRC16,但对于较短的散列,只会有更多的冲突。)哦,好的!谢谢你的解释。