24

文字列を一意の整数値に変更できるシステムを開発しようとしています。たとえば、「アカウント」という単語には 0891 という暗号化された数値があり、同じ変換プロセスで他の単語を 0891 に変換することはできません。 、ただし、生成された整数を文字列に変換できる必要はありません。

同時に、単語構造規則に依存します。つまり、「accuracy」や「announcement」などの単語は 0891 より大きい生成番号を持ち、「a」、「abacus」、「abbreviation」などの単語は 0891 より大きい生成番号を持ちます。生成された 0891 未満の数値。

このアプリケーションの目的は、インデックスまたは主キーと同様に機能することです。インクリメント インデックスを使用しない理由は、セキュリティ上の理由であり、インデックスがセット内のデータ数に依存するためです。

(例えば)

[0] A, [1] B, [2] C, [3] D, [4] E, [5] F

上記の文字にはそれぞれ対応するインデックスがあり、E のインデックスは 4 です。

ただし、データが急激に増減した場合はソートされます

[0] A, [1] AA, [2] AAB, [3] C, [4] D, [5] DA, [6] DZ, [7] E, [8] F

E のインデックスは 7 になりました

各単語には、一意の独立した同値の整数が必要であり、対応する重みがあります。

上記を実行できるアルゴリズムが存在するかどうかを知る必要があります。

どんな助けでも大歓迎です。

4

8 に答える 8

13

最大長を課さない限り、これは指定した制約では不可能です。

とがこれら 2 つの文字列のコードであるk("a")とします。k("b")

制約を使用して、これら 2 つの値の間に収まる一意の整数を探していますが、k("a") < k("a....a") < k("b"). 2 つのコードの間に収まる必要があるスタイル"a....a"(および)の文字列は無数にあるため、任意の長さの文字列に対して、一般的で一意の固定長コードを保持するような順序は存在しません。文字列と同じ数の整数が必要であり、文字列は長さに制限されていないため、これは機能しません。"akjhdsfkjhs"

一般 (新しい文字列の挿入を許可しない)、一意 (衝突を許可 - たとえば最初の 4 文字をコードとして使用!)、無制限の長さ (たとえば 3 文字まで)、または順序を維持するプロパティのいずれかをドロップします。

于 2013-05-13T12:08:08.070 に答える
4

一意性のために、文字に素数を割り当てることから始めます A -> 2, B -> 3, C -> 5, D -> 7

単語内の特定の文字の「キー」を計算するには、素数を単語内の位置インデックスで累乗します。単語全体の「キー」を取得するには、すべての文字キーを掛け合わせます。

たとえば、単語 CAB:

C -> 5 ^ 1 = 5
A -> 2 ^ 2 = 4
B -> 3 ^ 3 = 81
CAB -> 5 * 4 * 81 =  1620.

キーとして 1620 を与える言葉は他にありません。

注: マッピングを追跡している限り、A -> 2 から開始したり、アルファベットの文字に素数を順番に割り当てたりする必要はありません。また、この結果はすぐに大きくなることに注意してください。

ただし、セキュリティに関する他のコメントに注意してください。これは特に安全なアルゴリズムではありません。

于 2013-05-13T11:56:33.953 に答える