javascript - 具有最小基数的唯一标识符,不会在旧/新数据集上发生冲突
问题描述
我收到一棵或多棵节点树。
节点上可能有也可能没有 ID 属性。
目前我正在遍历树并在没有 ID 属性的节点上添加随机的 8 位数字。因为我不希望树中超过 10k 个节点发生碰撞的机会非常小。
我仍在考虑如何最好地将 ID 的长度减少到 4 位,同时确保一棵树内没有冲突。我想到的是遍历将现有 ID 收集到 Set 中的树一次,然后在检查 Set 是否没有冲突时再次添加新 ID。必须为每棵树重置集合。
如果有更多有效的方法可以实现这一目标,我将不胜感激您对此事的意见和建议。
附录 A:
我正在考虑以下(简化的 0-9)问题。如果我有一组现有的 ID [0, 1, 2, 5, 8, 9]
,我将不得不生成随机数,直到我得到例如 4(无冲突),我担心在更大的 Set 上会有点慢,而且肯定不是最佳路线。
解决方案
在这里,您有一个非常简单的方法,它将为您生成一个具有给定 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/
推荐阅读
- javascript - 如何禁用“重新加载站点?您所做的更改可能不会被保存”弹出(python)硒测试在chrome中?
- angular7 - 我想在 Angular 7 的材料数据表中同时应用搜索和日期范围过滤器
- qt - QThread 的started() 信号没有发出
- c++ - 从第二个线程调用 Qt 信号有效 -> 对连接的插槽没有影响
- javascript - 遍历字符串数组,找到重叠最多的两个字符串并将它们合并。重复直到剩下一串
- groovy - Gradle:如何将列表从配置闭包映射到扩展设置
- javascript - Fullcalendar:如何添加时间(小时,分钟)来创建事件表单?
- android - 如何解决 Android Studio 文件代码更改错误?
- apache - 如果找不到 wav 文件,如何将 wav 重定向到 htaccess 中的 mp3?
- xml - 验证 XML 消息重复记录中的字段(必填和可选)