java JPA更短的UUID?

时间:2016-02-19 17:23:33

标签: java oracle hibernate jpa uuid

我的java JPA Entity使用以下代码生成其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'但没有奇怪的字符)更短,以及如何确保这种表示形式是什么在数据库和应用程序中可见?

非常感谢

2 个答案:

答案 0 :(得分:2)

如果您愿意处理一些奇怪的密钥,请在高于16的基数中编码UUID,例如Base36(所有字母和数字,可以不区分大小写)或Base64(通常不是URL-安全)。如果您想要一些尽可能紧凑的URL安全,您可以使用my implementation of Flickr-compatible Base58,它具有用于编码和解码UUID对象的特定帮助程序。

答案 1 :(得分:1)

感谢您的帮助!使用base36确实可以解决问题。还有一件事是必要的,以确保较短的ID也是出现在DB中的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生成器注释)