5

私はC#で働いています。i外部ユーザー制御イベントに応答して徐々にインクリメントされる符号なし 32 ビット整数があります。この番号は、ユーザーが後で入力して検索できるように、一意の ID として 16 進数で表示されます。iインクリメントされている場合、または 2 つの整数の値が近接している場合 (距離 < 256 など)、非常に異なる 8 文字の文字列を表示する必要があります。たとえば、if i = 5and j = 6then:

string a = Encoded(i); // = "AF293E5B"
string b = Encoded(j); // = "CD2429A4"

これに関する制限は次のとおりです。

  1. 各インクリメントで文字列がどのように変化するかについて、明らかなパターンは必要ありません。
  2. このプロセスは可逆的である必要があるため、文字列が与えられれば元の数値を生成できます。
  3. 生成された各文字列は、2 つの数値が同じ文字列を生成しないように、32 ビットの符号なし整数の範囲全体で一意である必要があります。
  4. 文字列を生成するアルゴリズムは、エンコードとデコードの両方で実装および保守がかなり簡単でなければなりません (おそらく、それぞれ 30 行以下)。

でも:

  1. アルゴリズムは暗号的に安全である必要はありません。目標は、暗号化よりも難読化です。数値自体は秘密ではありません。明らかに増加する数値である必要はありません。
  2. インクリメントされた数字の大きなリストを見て、人間が文字列の変化のパターンを識別できれば問題ありません。それらが「近い」かどうかを明らかにしたくないだけです。

Minimal Perfect Hash Functionがこれらの要件を満たしていることは認識していますが、必要なことを実行する関数を見つけられなかったり、必要な関数を導出する方法を学習したりできませんでした。

私はこの質問を見たことがありますが、似たような傾向にありますが、私の質問は要件においてより具体的で正確であると思います。その質問に対する回答 (この記事の執筆時点) は、可能な実装の 3 つのリンクを参照していますが、Ruby に慣れていないため、「obfuscate_id」(最初のリンク) のコードを取得する方法がわかりません。Skipjack はやり過ぎのように感じます。私が必要とするもの(2番目のリンク)、そしてBase64は私が興味を持っている文字セット(16進数)を使用しません。

4

1 に答える 1