首页 > 解决方案 > 具有最小基数的唯一标识符,不会在旧/新数据集上发生冲突

问题描述

我收到一棵或多棵节点树。

节点上可能有也可能没有 ID 属性。

目前我正在遍历树并在没有 ID 属性的节点上添加随机的 8 位数字。因为我不希望树中超过 10k 个节点发生碰撞的机会非常小。

我仍在考虑如何最好地将 ID 的长度减少到 4 位,同时确保一棵树内没有冲突。我想到的是遍历将现有 ID 收集到 Set 中的树一次,然后在检查 Set 是否没有冲突时再次添加新 ID。必须为每棵树重置集合。

如果有更多有效的方法可以实现这一目标,我将不胜感激您对此事的意见和建议。

附录 A:

我正在考虑以下(简化的 0-9)问题。如果我有一组现有的 ID [0, 1, 2, 5, 8, 9],我将不得不生成随机数,直到我得到例如 4(无冲突),我担心在更大的 Set 上会有点慢,而且肯定不是最佳路线。

标签: javascripttypescriptuniqueidentifier

解决方案


在这里,您有一个非常简单的方法,它将为您生成一个具有给定 MAX 范围的未使用数字数组。

const MAX = 30;
const usedNumbers = [3, 4, 12, 13, 14, 16, 23, 27];

// https://stackoverflow.com/questions/3746725/how-to-create-an-array-containing-1-n
const notUsedNumbers = Array.from(Array(MAX), (_, i) => i+1).filter(i => !usedNumbers.includes(i));

console.log(notUsedNumbers);

并链接到小提琴:https ://jsfiddle.net/L9r6anq1/


推荐阅读