减少UUID中的位数

时间:2014-05-23 20:25:58

标签: java math numbers bits

我有一个用例来获取整数格式的分布式唯一序列号。 UUID对我来说是最好和最简单的解决方案。

但是,我只需要有整数,所以我会将那个大的十六进制数(UUID)转换为十进制数。 UUID有128位,因此会产生39位的十进制数。

由于一些严格的数据库限制,我无法承担39位数字。所以,我回到基础并尝试将数字首先转换为二进制,然后再转换为十进制。现在,将十六进制直接转换为二进制的标准过程是取每个十六进制数字并将其转换为4位。每个十六进制数可以转换为一组4位。因此,对于UUID中的32位十六进制数字,我们得到128位(32 * 4)。

现在,我想不遵循将每个十六进制数转换为4位的规则。相反,我只会使用足够的位来表示该数字。

例如,将12B作为一个十六进制数。 通过标准过程,转换为二进制文件为0000-0001-0010-1011(实际为9位)。 通过我的自定义过程,它实际上是1-10-1011(实际上是7位)。

因此,通过这种方法,减少了位数。现在,如果位减少,转换后的十进制数中的数字将减少,并且可以符合我的约束条件。

请帮助验证我的理论吗?这种方法有问题吗?这会导致碰撞吗?方法是否正确,我可以继续吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

是的,这会导致碰撞。

e.g。

0000-0001-0010-1011 -> 1101011
0000-0000-0110-1011 -> 1101011

答案 1 :(得分:0)

前一段时间我花了几天时间调试UUID碰撞问题(UUIDS被修剪),贬低这些事情是一场噩梦。你没有过得愉快。

您需要的只是实现您自己的唯一标识符shema - 根据您的用例,开发此类模式可能非常简单或非常困难。例如,您可以为每台机器分配一个唯一的编号(比方说两个字节),每台机器将从4字节命名空间中分配IDS。在6个字节中,您有一个很好的类似UUID的模式(有一些约束)。