java JPA 更短的 UUID?
java JPA shorter UUID?
my java JPA 实体使用以下代码生成其 UUID
@Entity
public class Myclass {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
String id;
String name;
}
在 Oracle 和 java 中作为字符串,ID 最终是这样的:
2c96cc2a52f9f9a90152fa6549f40008
一个32位的十六进制字符串。
我必须与需要在不同位置保存我的 ID 的第三方系统进行交互,而且它必须相同。不幸的是,他们的字段只允许 30 个字符的字符串(任何字符,不仅是十六进制)。
所以我需要我的 uuid 看起来像一个 30 个字符或更少的字符串,无论它出现在哪里(在 oracle 中,java,在第三方系统中,等等)。
我应该怎么做才能使该 uuid 的表示使用所有字母数字字符('ghi...z' 但没有奇怪的字符)更短,以及如何确保该表示在数据库中是可见的并且在应用程序中?
非常感谢
如果您愿意处理一些看起来很奇怪的密钥,请将 UUID 编码为大于 16 的基数,例如 Base36(所有字母和数字,可以不区分大小写)或 Base64(通常不区分大小写) URL-安全)。如果您想要尽可能紧凑的 URL-safe,您可以使用 my implementation of Flickr-compatible Base58,它具有用于编码和解码 UUID 对象的特定帮助程序。
感谢您的帮助!使用 base36 确实可以解决问题。然而,还有一件事是必要的,以确保较短的 ID 也出现在数据库中:
@PrePersist
public void generateId() {
String uuid_string = UUID.randomUUID().toString().replaceAll("-","");
BigInteger big = new BigInteger(uuid_string, 16);
String same_uuid_shorter_string = big.toString(36);
id = same_uuid_shorter_string ;
}
(也去掉了原来的id生成器注解)
my java JPA 实体使用以下代码生成其 UUID
@Entity
public class Myclass {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
String id;
String name;
}
在 Oracle 和 java 中作为字符串,ID 最终是这样的:
2c96cc2a52f9f9a90152fa6549f40008
一个32位的十六进制字符串。
我必须与需要在不同位置保存我的 ID 的第三方系统进行交互,而且它必须相同。不幸的是,他们的字段只允许 30 个字符的字符串(任何字符,不仅是十六进制)。
所以我需要我的 uuid 看起来像一个 30 个字符或更少的字符串,无论它出现在哪里(在 oracle 中,java,在第三方系统中,等等)。
我应该怎么做才能使该 uuid 的表示使用所有字母数字字符('ghi...z' 但没有奇怪的字符)更短,以及如何确保该表示在数据库中是可见的并且在应用程序中?
非常感谢
如果您愿意处理一些看起来很奇怪的密钥,请将 UUID 编码为大于 16 的基数,例如 Base36(所有字母和数字,可以不区分大小写)或 Base64(通常不区分大小写) URL-安全)。如果您想要尽可能紧凑的 URL-safe,您可以使用 my implementation of Flickr-compatible Base58,它具有用于编码和解码 UUID 对象的特定帮助程序。
感谢您的帮助!使用 base36 确实可以解决问题。然而,还有一件事是必要的,以确保较短的 ID 也出现在数据库中:
@PrePersist
public void generateId() {
String uuid_string = UUID.randomUUID().toString().replaceAll("-","");
BigInteger big = new BigInteger(uuid_string, 16);
String same_uuid_shorter_string = big.toString(36);
id = same_uuid_shorter_string ;
}
(也去掉了原来的id生成器注解)