随机生成ID并有效地将其持久化在Java中

好奇的技术员

我需要生成一个长度为 12 的数字,比如变量 finalId。在这 12 位数字中,有 5 位数字将取自另一个值,例如 partialid1。

现在 finalId = partialId1(5 - 位数)+ partialId2(7 位数)。

我需要随机生成partialid2,在那里我可以使用Java的Random类。

最后我必须在数据库中插入这个 finalId 作为主键。

因此,为了确保新生成的 finalId 不存在于 Oracle 数据库中,我还需要查询 Oracle 数据库。

除了我上面提到的方法之外,还有其他有效的方法可以在 Java 中生成 Id 并在持久化之前检查数据库吗?

埃文·琼斯

一般来说,从另一个 id 制作一个 id 有问题,因为您可能将两件事聚集在一起,这会更容易分开。具体来说,当您只能使用两个键时,您可能会尝试将外键压缩到主键中。

在任何情况下,如果您真的想从存根构建半随机主键,那么我建议按位进行,因为这样很容易在 SQL 和 Java 中提取原始 ID。

如前所述,如果您生成一个 UUID,那么您真的不需要担心检查它是否已经被使用,否则您可能会想要。

也就是说,制作您的 id 的代码可能如下所示:

public class IdGenerator {
    private SecureRandom random = new SecureRandom();   
    private long preservedMask;
    private long randomMask;

    public void init(int preservedBits) {
        this.preservedMask = (1L << preservedBits) - 1;
        this.randomMask = ~this.preservedMask;
    }

    public long makeIdFrom(long preserved) {
        return (this.random.nextLong() & this.randomMask) | (preserved & this.preservedMask);
    }

    public UUID makeUuidFrom(long preserved) {
        UUID uuid = UUID.randomUUID();
        return new UUID(uuid.getMostSignificantBits(), (uuid.getLeastSignificantBits() & this.randomMask) | (preserved & this.preservedMask));
    }

    public boolean idsMatch(long id1, long id2) {
        return (id1 & this.preservedMask) == (id2 & this.preservedMask);
    }
}

本质上,这会保留原始文件中的一些最低有效位。调用init时需要指定的数字

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章