代码之家  ›  专栏  ›  技术社区  ›  dlinsin JaviAlgaba

在Java中使用UUID的最高有效位发生冲突的可能性

  •  230
  • dlinsin JaviAlgaba  · 技术社区  · 16 年前

    如果我正在使用 Long uuid = UUID.randomUUID().getMostSignificantBits() 发生碰撞的可能性有多大。它切断了最低有效位,所以有可能发生冲突,对吗?

    5 回复  |  直到 6 年前
        1
  •  218
  •   Rasmus Faber    9 年前

    根据 the documentation 静态法 UUID.randomUUID()

    六个非随机位分布在UUID的最高有效一半中有四个,最低有效一半中有两个。因此,UUID中最重要的一半包含60位随机性,这意味着您平均需要生成2^30个UUID才能获得冲突(相比之下,完整UUID为2^61)。

        3
  •  13
  •   Kannika    12 年前

    我认为这是使用randomUUID的最佳示例:

    http://www.javapractices.com/topic/TopicAction.do?Id=56

        4
  •  10
  •   Peter Lawrey    15 年前

    有不同程度的独特性。

    如果您需要跨多台机器的唯一性,您可以使用一个中央数据库表来分配唯一ID,甚至可以批量分配唯一ID。

        5
  •  7
  •   Jesse    11 年前

    使用时间 YYYYDDDD byte[40] . 我在混合环境中使用了它,其中Active Directory SID( varbinary(85) )是LDAP用户的密钥,应用程序自动生成的ID用于非LDAP用户。此外,事务表(银行业)中每天有大量事务无法使用标准 Int

    private static final DecimalFormat timeFormat4 = new DecimalFormat("0000;0000");
    
    public static byte[] getSidWithCalendar() {
        Calendar cal = Calendar.getInstance();
        String val = String.valueOf(cal.get(Calendar.YEAR));
        val += timeFormat4.format(cal.get(Calendar.DAY_OF_YEAR));
        val += UUID.randomUUID().toString().replaceAll("-", "");
        return val.getBytes();
    }