0

いくつかのパラメーターを、短くて予測不可能なスペル可能なコードにグループ化する必要があります。元:

  • シリアル:WJ-JHA5JK7E9RTAS
  • 日付: 2013 年 4 月 2 日
  • 日: 30
  • 有効: 真

圧縮されたコードは次のようになります: 3xy9b0laiph3s

私の目標は、コードをできるだけ短くすることです (もちろん、情報を失うことはありません)。アルゴリズムは、他の言語でも簡単に実装できる必要があります (そのため、狂った特定の依存関係を持つことはできません)。何かご意見は?

4

3 に答える 3

1

任意の短い文字列の場合、圧縮の一般化された予測方法を適用するには十分な情報がありません。

データの既知の機能を活用する必要があります。

例:

  • シリアル番号は、大文字と数字 (1 文字あたり 36 個の値) で、長さは 15 文字のように見えます。これは、78 ビットに収まる 36^15 の可能な値です。
  • 日付は、固定日からの日数に変換できます。すべての日付が互いに 100 年以内にあることがわかっている場合、これは 16 ビットで格納できます。
  • 日が年を超えない場合、これは 9 ビットで格納できます。
  • Valid は 1 ビットに格納できます。

これは 104 ビットで、Base64 で 18 文字にエンコードできます

多くの場合、シリアル番号にはチェックサム文字が 1 つまたは 2 つあることに注意してください。チェックサムの計算方法がわかっている場合は、この文字を省略して、デコード時に再計算できます。これにより、ここで Base64 数字を節約できます。

重い暗号化を心配することなく、結果を予測しにくくしたい場合は、エンコードされた文字列を決定論的にシャッフルすることができます。

于 2012-11-07T17:41:09.053 に答える
1

ほとんどの場合、これはデータをどこかに保存し、圧縮して使用する ID を作成することで処理されます。このシステムの最も一般的なユーザーは、短い URL サイトです。

  • データをDBに格納し、行IDを取得
  • base-10 の行 ID を base 32 または 64 に変換します (PHP では base_convert)
  • 「4F7c」のような新しい ID を使用します
  • その ID が渡されたら、変換を解除して 10 進数に変換し、DB 内のデータを検索します。

コード:

$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 に答える