10

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

例如,我有安全 ID = 'ABC123DEF' 我应该能够生成“安全 ID”的唯一 ID(仅限 int),以便唯一 ID 始终保持不变。

例如安全 ID:ABC123DEF Int ID:9463456892

这样我就可以将 Int ID 存储在 Database 中,并随时从 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 之后的下一个素数)。我没有检查的部分是生成的哈希是否会大于你的长整数的大小。但你可以从那里拿走它...

于 2012-09-24T19:24:56.853 回答
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 回答