从字母数字字符串生成唯一ID

Ans*_*hul 10 algorithm algorithmic-trading

我需要从字母数字字符串生成UNIQUE id(仅限int).

例如,我有安全ID ='ABC123DEF'我应该能够生成"安全ID"的唯一ID(仅限int),以便唯一ID始终是常量.

例如:安全ID:ABC123DEF Int ID:9463456892

这样我就可以将Int ID存储在数据库中,并随时从Int ID中引用安全ID.

一些例子:PBG_CD_20120214_.2 | 201202-CMG188963_T | PBG_TD_20120306_.0001 3个例子:-PIPE分开

mpr*_*vat 27

只需使用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;
}
Run Code Online (Sandbox Code Playgroud)

为了避免碰撞100%,您需要一个比您的角色之间更宽的差异​​更大的素数.因此,对于7位ASCII,您需要高于128的值.因此,使用131(128后的下一个素数)而不是31.我没有检查过的部分是生成的哈希值是否会大于你的长整数的大小.但你可以从那里拿走它......

  • 如果有效,请不要忘记为社区的利益批准答案 (4认同)

red*_*ent 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;
Run Code Online (Sandbox Code Playgroud)