【问题标题】:Reversible string compression PHP/C++可逆字符串压缩 PHP/C++
【发布时间】:2017-08-18 13:23:59
【问题描述】:

我想对一些短文本数据进行模糊处理,并使这种压缩可学习/可记忆。

所以我正在寻找一种可在 PHP 中实现的算法,以将字符串(约 25 个字符长)压缩为约 8 个字符的字符串,然后在 C++ 中可逆。

有人知道算法名称或其他想法吗?

编辑:一切都是小写,带有两个特殊字符。

【问题讨论】:

  • 文本数据由什么组成?小写,大写,数字?还有其他角色吗?
  • 一切都是小写的,有一些特殊字符。
  • 有多少特殊字符?我问是因为它需要设计编码方案。
  • 只会使用两个特殊字符
  • 您是否尝试过两次压缩 ZIP 存档?您会注意到压缩已压缩的存档不会进一步减小其大小。您的字符串也是如此,总会有无法进一步压缩的字符串。这意味着:您只能从例如获得 平均 压缩率。 25到8个字符,总会有例外。当然,除非通过压缩实际上意味着使用更大的字母进行编码,其中每个字符存储更多信息。

标签: php c++ algorithm compression obfuscation


【解决方案1】:

不可能。

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

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

这大约减少了 1023 倍!通过pigeonhole principle,您要求的压缩方案是不可能的 - 可能的输入字符串比输出多 许多 倍,因此无法将每个输入字符串可逆地转换为输出和返回。

【讨论】:

  • 那么像 CRC-16 编码这样的算法不会产生唯一的输出字符串?
  • @Bloo2 不!例如,"plumless""buckeroo" 都具有 CRC32 0x4ddb0c25。 (这是 CRC32,而不是 CRC16,但对于较短的哈希,只会有 更多 个冲突。)
  • 哦,好的!感谢您的解释。
【解决方案2】:

由于文本数据只包含小写字母和两个特殊字符,所以我们只需要考虑 28 个不同的字符。

我们可以通过位表示的属性来设计哈希函数。通过所有可能的 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++ 实现。

【讨论】:

  • 好主意。但是即使我可以模拟输出字符串的固定长度,16 个字符也实在是太难以记住了……更不用说在我看来,在 5 位上进行编码将很难在输出中显示字符。
  • 是的,遗憾的是,一些生成的字符也不是 ASCII 或可显示的,但它肯定会工作。
  • 我需要这种压缩记忆。
  • 16 个字节被认为是可记忆的,因为人们通常会记住 MD5 哈希。你会有多少哈希?
  • 用户只需要记住一个哈希值,但要求记住 16 个字符对他们来说会很困难。我想少于 10 个是可以的,8 个就可以了。
猜你喜欢
  • 1970-01-01
  • 2011-11-12
  • 2013-10-30
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多