Java 从多个数字标识创建唯一的数字标识
从多个数字64位ID开始生成唯一64位ID的好算法是什么?例如: 输入:[2,9875,0,223568,…]随机64位ID的列表 输出:一个唯一的64位数字ID,对于给定的输入必须相同 我正在寻找一种避免身份冲突的方法Java 从多个数字标识创建唯一的数字标识,java,algorithm,Java,Algorithm,从多个数字64位ID开始生成唯一64位ID的好算法是什么?例如: 输入:[2,9875,0,223568,…]随机64位ID的列表 输出:一个唯一的64位数字ID,对于给定的输入必须相同 我正在寻找一种避免身份冲突的方法 对于这个不清楚的问题,我深表歉意。如果您想了解更多信息,旧问题将对您有用,但您可以尝试以下方法: java.util.UUID.randomUUID().hashCode() private static final AtomicLong COUNTER = new Ato
对于这个不清楚的问题,我深表歉意。如果您想了解更多信息,旧问题将对您有用,但您可以尝试以下方法:
java.util.UUID.randomUUID().hashCode()
private static final AtomicLong COUNTER = new AtomicLong(System.currentTimeMillis()*100000);
如果以前的解决方案在您的案例中不起作用,请尝试以下方法:
java.util.UUID.randomUUID().hashCode()
private static final AtomicLong COUNTER = new AtomicLong(System.currentTimeMillis()*100000);
或算法(GitHub链接)。如果速度无关紧要,那么: 在md5算法中输入所有ID,而不是简单地使用 a) 前64位或
b) 最后64位或
c) 前64位异或后64位
如果速度很重要 那么: 步骤1:对所有64位ID的字节重新排序(对于输入的每个64位ID,以固定但不同的顺序排列)。(如果值不是随机分布的,这可能会有所帮助) 步骤2:对所有重新排列的64位id进行异或,以获得新的64位id
如果您没有关于64位输入ID范围或值分布的额外信息,则无法以“聪明的”/“最佳的”方式避免冲突。因为无论你提出什么,你总会发现一组会导致冲突的输入。请阅读如何使你的问题变得清晰一些更多的约束条件会很有用。例如,如果您知道所有ID的长度最多为10个字符,并且您不关心生成的ID的长度,那么您可以连接:000000000 2000009750000000223568您知道多个数字64位ID的值的分布情况吗?@MrSmith42不,在这种情况下,它们是随机的,我将更新问题