【问题标题】:Generate Unique ID from Alphanumeric String从字母数字字符串生成唯一 ID
【发布时间】:2012-09-24 19:11:11
【问题描述】:

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

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

例如 安全编号:ABC123DEF 国际编号:9463456892

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

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

【问题讨论】:

  • 你很具体,它必须是一个int,但是请定义int?您输入的数字对于通常指 32 位的传统 int 来说太大了,尽管它适合很长。数字 ID 的空间限制是什么?
  • 嗨,吉米,它可以是长整数。也许我应该这样说。生成的 ID 应为“数字 (0 - 9)”

标签: algorithm algorithmic-trading


【解决方案1】:

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

【讨论】:

  • 如果可行,请不要忘记为社区的利益批准答案
  • 优雅的解决方案!将其移植到 maxscript(3dsmax 脚本)中,对其进行了测试,到目前为止我没有任何碰撞。这是宝石!
【解决方案2】:

您可以将每个字符编码为两位数,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;

【讨论】:

  • 我有一个字母数字字符串:例如“201202-CMG277440_T”
  • 数字的大小是否有限制?
  • 否 - 数字的大小没有限制。
  • 那么如果连字符和下划线有两个额外的数字,这个算法就可以工作。如果您需要较小的数字,我也有建议的解决方案
猜你喜欢
  • 1970-01-01
  • 2017-12-09
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 2011-01-12
相关资源
最近更新 更多