Java UUID的长表示法

5

我正在将大量的Java UUID 以行的形式存储在 HashMap 中,使用 UUID.toString()。由于数据量巨大,很快就会抛出 OutOfMemoryError。现在我正在考虑一种紧凑的方式来表示 UUID,最好是像 long 这样的东西,然后稍后我可以使用该 long 表示法轻松地重构出 UUID。这种情况可能吗?

2个回答

9
我将Java UUID 存储为行,使用 UUID.toString(),并将其存储到 HashMap 中。
这意味着您是想使用 HashMap<String, MyObject>
通过将UUID本身存储在HashMap<UUID, MyObject>中,与HashMap<String, MyObject>相比,可以节省空间。一个UUID占用的空间比String少(两个long值变成16字节,而不是72字节的char[36],从这里就可以节省近80%的空间)。
如果改变还不够,请考虑一下UUID值是否在JVM之间很重要。如果ID只需要在单个进程中是唯一的(您是否将HashMap保存到磁盘或在Java进程之间共享?),那么可以使用int,因为HashMap不能超过Integer.MAX_VALUE。所以,你将有HashMap<Integer, MyObject>而不是HashMap<UUID, MyObject>。更好的是,如果您将拥有小于216个对象,则可以使用Short来节省更多的空间。但是,如果您收到OutOfMemoryError错误消息,那么我怀疑您可能有超过65536个对象。
最后,如果所有其他方法都失败,则可以根据此问题中的演示为您的JVM分配更多内存。

8

UUID基本上是一个数字,但它是一个128位的数字,是java long的两倍大小。您可以使用BigInteger(可能与将UUID作为字符串存储一样不占用更多空间),或者您可以将UUID封装在包含两个longs的对象中 - 一个用于前64位,另一个用于后64位。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接