0

我需要将一些参数组合成一个简短的、不可预测的、可拼写的代码。前任:

  • 序列号:WJ-JHA5JK7E9RTAS
  • 日期:2013 年 4 月 2 日
  • 天数:30
  • 有效:真

压缩后的代码可能如下所示:3xy9b0laiph3s

我的目标是使代码尽可能短(当然,不会丢失任何信息)。该算法也必须很容易用其他语言实现(因此它不能有疯狂的特定依赖关系)。有什么想法吗?

4

3 回答 3

1

对于任意短字符串,没有足够的信息来应用压缩的广义预测方法。

您需要利用数据的已知特征。

例子:

  • 序列号似乎是大写字母和数字 - 每个字符 36 个值 - 和 15 个字符长。这是 36^15 个可能的值,适合 78 位。
  • 日期可以转换为自固定日期以来的天数。如果已知所有日期都在 100 年内,则可以将其存储为 16 位。
  • 如果天数永远不会超过数年,则可以将其存储为 9 位。
  • 有效可以存储在 1 位中。

那是 104 位,可以 Base64 编码为 18 个字符

请注意,序列号通常有一两个校验和字符。如果你知道校验和是如何计算的,你可以省略这个字符并在解码时重新计算它。这可以在这里为您节省一个 Base64 数字。

如果您想让结果更难以预测,而不用担心重度加密,您可以确定性地打乱您的编码字符串。

于 2012-11-07T17:41:09.053 回答
1

大多数情况下,这是通过将数据存储在某处并创建一个 ID 来处理的,然后将其压缩和使用。该系统最常见的用户是短 URL 网站。

  • 将数据存储在数据库中并获取行 ID
  • 将基数为 10 的行 ID 转换为基数 32 或 64(PHP 中的 base_convert)
  • 使用看起来像“4F7c”的新 ID
  • 当传递该 ID 时,只需将其取消转换为以 10 为底并在数据库中查找数据

代码:

$id = 23590;
print $id;
$hash = base_convert($id, 10, 32);
print $hash;
$id = base_convert($hash, 32, 10);
print $id;
于 2012-11-07T17:07:36.340 回答
0

UUencode 或 Base64,但在这些编码中大小写是匹配的。最终,您可以根据自己的目的编辑这些编码(仅限小写字母)。如果您拥有完全相同数量的数据,这将是最简单的解决方案。但不是最小的。

于 2012-11-07T17:03:03.087 回答