我需要为字符串生成唯一的整数id。
原因:
我有一个可以在不同数据库上运行的数据库应用程序。此数据库包含参数类型的参数,这些参数类型是从外部 xml数据生成的。
目前的情况是我使用了Enum的序号。但是当插入或删除参数时,序数会混淆:
(FOOD = 0,TOYS = 1)< - > (FOOD = 0,NONFOOD = 1,TOYS = 2)
参数类型的数量在200到2000之间,所以我对一个字符串使用hashCode()感到害怕。
P.S。:我正在使用Java。
非常感谢
答案 0 :(得分:5)
我会在数据库中使用映射表将这些字符串映射到自动增量值。然后应将这些映射缓存在应用程序中。
答案 1 :(得分:2)
答案 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;
}