10

英数字の文字列から UNIQUE ID (int のみ) を生成する必要があります。

たとえば、私は security id = 'ABC123DEF' を持っています。一意の ID が常に一定になるように、"security id" の一意の ID (int のみ) を生成できるはずです。

例: セキュリティ ID: ABC123DEF Int ID: 9463456892

Int ID をデータベースに保存し、いつでも Int ID からセキュリティ ID を参照できるようにします。

いくつかの例: PBG_CD_20120214_.2 | 201202-CMG188963_T | PBG_TD_20120306_.0001 3 つの例:-PIPE 区切り

4

2 に答える 2

31

Java ハッシュ アルゴリズムを使用するだけです。100% 一意ではありませんが、それをベースとして使用し、何かを追加して、はるかに小さな衝突セットで一意性を保証することができます。

public static int hash(String s) {
    int h = 0;
    for (int i = 0; i < s.length(); i++) {
        h = 31 * h + s.charAt(i);
    }
    return h;
}

衝突を 100% 回避するには、キャラクター間の差よりも大きい素数が必要です。したがって、7 ビット ASCII の場合は、128 よりも大きい値が必要です。したがって、31 の代わりに 131 (128 の次の素数) を使用します。私がチェックしていない部分は、生成されたハッシュが long int のサイズより大きくなってしまうかどうかです。しかし、あなたはそこからそれを取ることができます...

于 2012-09-24T19:24:56.853 に答える
2

各文字を 2 桁の数字、0 ~ 9 を数字そのもの、10 ~ 35 を AZ としてエンコードできます。

たとえば、9AC8 は 09 10 12 08 = 09101208 になります。

編集:少数の場合、このアプローチを使用できます(Javaスタイルの疑似コードを使用):

char[] availableChars = ['A', 'B', ... , '0', ... '9', '-', '_', '.'];
long hash = 0;
long base = 1;
for (char c in string.toCharArray())
    for (int key=0; key < availableChars.length; key++)
        if (availableChars[key] != c)
            continue;
        hash += base*key;
        base = base*availableChars.length

return hash;
于 2012-09-24T19:15:56.457 に答える