从String生成唯一的整数ID

时间:2011-06-14 15:04:11

标签: java hash cryptography code-generation



我需要为字符串生成唯一的整数id。

原因:
我有一个可以在不同数据库上运行的数据库应用程序。此数据库包含参数类型的参数,这些参数类型是从外部 xml数据生成的。 目前的情况是我使用了Enum的序号。但是当插入或删除参数时,序数会混淆:
(FOOD = 0,TOYS = 1)< - > (FOOD = 0,NONFOOD = 1,TOYS = 2)

参数类型的数量在200到2000之间,所以我对一个字符串使用hashCode()感到害怕。

P.S。:我正在使用Java。

非常感谢

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

使用加密哈希。 MD5可能足够且相对较快。它对您的输入集来说足够独特。

How can I generate an MD5 hash?

唯一的问题是散列是128位,因此标准的64位整数不会保留它。

答案 2 :(得分:1)

如果你需要绝对确定id是唯一的(没有碰撞)并且你的字符串最多为32个字符,并且你的数字必须不超过10位数(大约32位),你显然不能这样做通过单向函数id=F(string)

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

答案 3 :(得分:0)

如果您知道字符串值的类型(长度,字母模式),则可以计算此集合中的字符串总数,如果它符合32位,则count函数是您的整数值。

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

答案 4 :(得分:0)

By Enum你的意思是Java Enum?然后你可以通过自己给每个枚举值一个唯一的int,而不是使用它的序数:

public enum MyEnum {

    FOOD(0),
    TOYS(1),

    private final int id;

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

答案 5 :(得分:0)

我发现了这篇明智的帖子: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;
}