Java UUID的长表示

use*_*587 4 java uuid out-of-memory

我正在使用大量的Java存储UUIDHashMap一行UUID.toString().由于数据量巨大,很快就会抛出OutOfMemoryError.现在我正在考虑一种紧凑的方式来表示UUID,最好是类似的东西long,然后我可以轻松地UUID用该long表示重建.这可能吗?

hob*_*bbs 8

UUID基本上是一个数字,但它是一个128位的数字,是java long的两倍.您可以使用BigInteger(可能不比将UUID存储为字符串更节省空间),或者您可以将UUID封装在包含两个long的对象中 - 一个用于前64位,一个用于最后64位.

给定UUID 550e8400-e29b-41d4-a716-446655440000,您需要创建两个长整数0x550e8400e29b41d4,一个包含数字,另一个包含数字0xa716446655440000.


Bri*_*ian 7

我正在使用大量的Java存储UUIDHashMap一行UUID.toString().

所以你的意思是HashMap<String, MyObject>

与之HashMap<UUID, MyObject>相比,通过存储UUID本身可以节省空间HashMap<String, MyObject>.A UUID比空间占用更少的空间String(两个long值变为16个字节而不是char[36]72个字节,这样可以节省大约80%的空间).

如果改变这还不够,那么考虑这些UUID值是否在JVM中是重要的.如果ID只需要对于单个进程是唯一的(您是保存HashMap到磁盘还是 Java进程之间共享它?),那么您可以使用,int因为无论如何HashMap都不能大于Integer.MAX_VALUE任何大小.所以不是HashMap<UUID, MyObject>,你有HashMap<Integer, MyObject>.更好的是,Short如果您的对象少于2 16个,则可以使用,从而节省更多空间.但是,如果你得到一个OutOfMemoryError,我怀疑你可能有超过65536个对象.

最后,如果所有其他方法都失败了,请为此 JVM分配更多内存,如此问题所示.