我的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'但没有奇怪的字符)更短,以及如何确保这种表示形式是什么在数据库和应用程序中可见?
非常感谢
答案 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生成器注释)