繁体   English   中英

从字符串生成唯一的 integer ID

[英]Generating a unique integer ID from a String



我需要为字符串生成一个唯一的 integer id。

原因:
我有一个可以在不同数据库上运行的数据库应用程序。 该数据库包含从外部xml 数据生成的参数类型的参数。 目前的情况是我使用枚举的序数。 但是当插入或删除参数时,序数会混淆:
(食品 = 0,玩具 = 1)<-->(食品 = 0,非食品 = 1,玩具 = 2)

参数类型的数量在 200 到 2000 之间,所以我有点害怕使用 hashCode() 作为字符串。

PS:我使用的是Java。

非常感谢

我会使用数据库中的映射表到 map 这些字符串到自动增量值。 然后应将这些映射缓存在应用程序中。

使用加密 hash。 MD5 可能就足够了,而且速度相对较快。 对于您的输入集,它将是独一无二的。

如何生成 MD5 hash?

唯一的问题是 hash 是 128 位的,因此标准的 64 位 integer 将无法容纳它。

如果您需要绝对确定 id 是唯一的(没有冲突)并且您的字符串最多为 32 个字符,并且您的号码必须不超过 10 位(大约 32 位),那么您显然不能做到这一点方式 function id=F(string)

自然的方法是在数据库或应用程序中保留字符串到唯一数字(通常是序列)的一些映射。

我遇到了这个明智的帖子: How to convert string to unique identifier in Java

作者在其中描述了他的实现:

public static long longHash(String string) {
  long h = 98764321261L; 
  int l = string.length();
  char[] chars = string.toCharArray();

  for (int i = 0; i < l; i++) {
    h = 31*h + chars[i];
  }
  return h;
}

如果您知道字符串值的类型(长度、字母模式),则可以计算该集合中的字符串总数,如果它适合 32 位,则计数 function 就是您的 integer 值。

否则,字符串本身就是您的 integer 值(数学术语中的整数,而不是 Java)。

枚举是指 Java 枚举? 然后你可以自己给每个枚举值一个唯一的 int 而不是使用它的序数:

public enum MyEnum {

    FOOD(0),
    TOYS(1),

    private final int id;

    private MyEnum(int id)
    {
        this.id = id;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM