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

时间:2012-09-24 19:11:12

标签: algorithm algorithmic-trading

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

e.g。我有安全ID ='ABC123DEF' 我应该能够生成“安全ID”的唯一ID(仅限int),以便唯一ID始终是常量。

e.g。 安全ID:ABC123DEF 内特工程号:9463456892

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

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

2 个答案:

答案 0 :(得分:23)

只需使用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的值。因此,使用131(128后的下一个素数)而不是31。我没有检查过的部分是生成的哈希值是否会大于你的长整数的大小。但你可以从那里拿走它......

答案 1 :(得分:1)

您可以将每个字符编码为两位数字,0-9表示数字本身,10-35表示为A-Z。

例如,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;