DB主键的Java字符串转换

DB主键的Java字符串转换,java,database,jakarta-ee,hash,primary-key,Java,Database,Jakarta Ee,Hash,Primary Key,我想将字符串(从XML文件)转换为DB主键 特别是,我想确保这个值是唯一的,都是正数,并且遵守DB主键规范,即:NUMBER(9) 我尝试转换的字符串具有以下特征: PDR_20140909150001 显然,我可以忽略字符串的第一部分(因为对于所有文件都是相同的),但我必须将时间戳字符串(如20140909150001)转换为最大长度为9位的int值 我该怎么办 您不能使用任何散列函数作为主键,因为散列函数性质:它是满射的,不能是唯一的。您不能使用任何散列函数作为主键,因为散列函数性质:它是满

我想将字符串(从XML文件)转换为DB主键

特别是,我想确保这个值是唯一的,都是正数,并且遵守DB主键规范,即:NUMBER(9)

我尝试转换的字符串具有以下特征:

PDR_20140909150001

显然,我可以忽略字符串的第一部分(因为对于所有文件都是相同的),但我必须将时间戳字符串(如
20140909150001
)转换为最大长度为9位的int值


我该怎么办

您不能使用任何散列函数作为主键,因为散列函数性质:它是满射的,不能是唯一的。

您不能使用任何散列函数作为主键,因为散列函数性质:它是满射的,不能是唯一的。

理论上散列是创建以尽可能避免碰撞,但不能保证它们都是唯一的。在9个数字的严格要求下,情况就更糟了。这是行不通的


使用数据库序列或UUID。

理论上,创建哈希是为了尽可能避免冲突,但它们都不能保证唯一。在9个数字的严格要求下,情况就更糟了。这是行不通的


使用数据库序列或UUID。

您需要的是一个双射整数到字符串函数,这是讨论过的。

您需要的是一个双射整数到字符串函数,这是讨论过的。

我更愿意称您的“哈希代码”为转换

通常,您不能进行这种转换,因为如果
字符串足够长(例如,长度超过10个字符),则该字符串中可能存在的值比9位数字所能表示的值更多

如果输入字符串保证短于限制,则可以进行此类转换。最大输入限制为2个字符,因为Java中的1个字符是16位,即2个字节,3个字符是6个字节(这不适合
数字(9)
)。
NUMBER(9)
的最大值为
9999999
,即
0x3B9AC9FF
,即4个字节

转换:

String key = ...; // Read key, must be 2 characters at the most

int dbKey = 0; // NUMBER(9) fits into a Java int
for (int i = 0; i < key.length(); i++) {
    dbKey <<= 16;
    dbKey += key.charAt(i);
}
字符串键=…;//读取键,最多只能为2个字符
int dbKey=0;//数字(9)适合于Java int
对于(int i=0;i
通常,您不能进行这种转换,因为如果
字符串足够长(例如,长度超过10个字符),则该字符串中可能存在的值比9位数字所能表示的值更多

如果输入字符串保证短于限制,则可以进行此类转换。最大输入限制为2个字符,因为Java中的1个字符为16位,即2个字节,3个字符为6个字节(不适合
数字(9)
)。最大值为
数字(9)
9999999
0x3B9AC9FF
是4个字节

转换:

String key = ...; // Read key, must be 2 characters at the most

int dbKey = 0; // NUMBER(9) fits into a Java int
for (int i = 0; i < key.length(); i++) {
    dbKey <<= 16;
    dbKey += key.charAt(i);
}
字符串键=…;//读取键,最多只能是2个字符
int dbKey=0;//数字(9)适合于Java int
对于(int i=0;i
dbKey有很多创建主键的机制:其中一部分是在db中实现的。我自己不能接触db,我只能在软件中工作-side@Andremoniy这是主观的还是主观的?我想你是故意的Surjective@Keerthivasan满射事实上是正确的,这使得编辑成了一个倾斜的满射。愚蠢的印刷错误。非常感谢。有很多创建主键的机制:其中一部分是在db中实现的。我不能触摸db,我只能在软件中工作-side@Andremoniy这是主观的还是主观的?我想你是故意的Surjective@Keerthivasan满射的事实上是正确的,这使得编辑成了一个倾斜的,满射的,愚蠢的错误打印。非常感谢。谢谢!你知道我可以在软件方面开发什么吗?如果你想要软件生成的密钥,请使用UUID.randomUUID(),它会生成类型4 UUID。如果需要,还可以使用其他类型。最理想的方案(至少在某些数据库中,如oracle)是将UUID存储为raw。如果您无法将类型从数字(9)更新为raw/varchar,也无法将序列生成器添加到数据库中,则基本上是错误的。从软件生成唯一的数字(我假定这是群集设置)这是一个很难解决的问题不幸的是,我无法编辑数据库及其表。我的问题是,在软件方面,在主键中转换包含此类信息的字符串:PDR_dateandhour。我可以理解为什么数据类型更改可能很难,但不允许向数据库添加序列。告诉你的老板这是目前为止最好的解决方案。其他任何东西都需要花费大量的时间来开发,而且很容易出错。谢谢!您知道我可以在软件方面开发什么吗?如果您想要由您的软件生成密钥,请使用UUID.randomUUID(),它生成类型4 UUID。如果需要,还可以使用其他类型。最理想的方案(至少在某些数据库(如oracle)中)是将UUID存储为原始数据。如果无法将类型从数字(9)更新为raw/varchar,也无法将序列生成器添加到数据库中,则基本上是错误的。从软件生成唯一的数字(我假定这是群集设置)这是一个很难解决的问题不幸的是,我无法编辑数据库及其表。我的问题是,在软件方面,在主键中转换包含此类信息的字符串:PDR_dateandhour。我可以理解为什么数据类型更改可能很难,但不允许向数据库添加序列。告诉你的老板这是目前为止最好的解决方案。其他任何东西都需要花费大量时间来开发