繁体   English   中英

Java的JPA较短的UUID?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM