[英]java JPA shorter UUID?
我的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个字符的字符串(任何字符,不仅是十六进制)。
因此,无论在哪里出现(在oracle,java,该第三方系统等)中,我都需要uuid看起来不超过30个字符。
我应该怎么做才能使该uuid的表示使用所有字母数字字符(“ ghi ... z”,但没有奇怪的字符)来缩短,以及如何确保这种表示在数据库和应用程序中可见?
非常感谢
如果您愿意处理一些看起来有些奇怪的键,请使用大于16的基数对UUID进行编码,例如Base36(所有字母和数字,不区分大小写)或Base64(通常不是URL安全的)。 如果您想要一个尽可能紧凑的URL安全的东西,可以使用我的Flickr兼容Base58的实现 ,该实现具有用于编码和解码UUID对象的特定帮助器。
谢谢您的帮助! 使用base36确实可以解决问题。 但是,还需要做一件事以确保较短的ID也是数据库中出现的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生成器注释)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.