Javascript 具有最小基数的唯一标识符,在旧/新数据集上不会发生冲突

Javascript 具有最小基数的唯一标识符,在旧/新数据集上不会发生冲突,javascript,typescript,uniqueidentifier,Javascript,Typescript,Uniqueidentifier,我接收一个或多个节点树 节点上可能有ID属性,也可能没有ID属性 目前,我正在遍历树,并在没有ID属性的节点上添加随机8位数。由于我预计树中的节点不会超过10k,因此发生碰撞的可能性非常小 但我仍在考虑如何最好地将ID的长度减少到4位数,同时确保一棵树中没有冲突。我想到的是在树中迭代一次,将现有ID收集到一个集合中,然后再次添加新ID,同时检查集合中是否存在冲突。必须为每个树重置集合 如果有更有效的方法来实现这一点,我将非常感谢您对此事的意见和建议 附录A: 我正在考虑以下(简化的0-9)问题。

我接收一个或多个节点树

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

目前,我正在遍历树,并在没有ID属性的节点上添加随机8位数。由于我预计树中的节点不会超过10k,因此发生碰撞的可能性非常小

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

如果有更有效的方法来实现这一点,我将非常感谢您对此事的意见和建议

附录A:


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

这里有一个非常简单的方法,可以为您生成一个具有给定最大范围的未使用数字数组

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)=>i+1.filter(i=>!usedNumbers.includes(i));

控制台日志(未使用的编号)这里有一个非常简单的方法,它将为您生成一个具有给定最大范围的未使用数字数组

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)=>i+1.filter(i=>!usedNumbers.includes(i));

控制台日志(未使用的编号)10^8随机选择的可能性意味着您有50%的几率与10^4个对象发生碰撞(参见生日悖论);这不是“非常小”的可能性。对于10^4个对象,将其减少到10^4的可能性意味着碰撞将在接近终点时接近100%,并且,如果有一天有10k+1个对象,碰撞将永远不会终止


一般来说,如果您想使用相对较短的ID空间,则需要一个非常高效的冲突检测系统,例如,将所有已分配(或未分配)的值保存在草稿行中,或者干脆放弃随机赋值,按顺序进行。

10^8随机选择的可能性意味着您有50%的几率与10^4个对象发生碰撞(参见生日悖论);这不是“非常小”的可能性。对于10^4个对象,将其减少到10^4的可能性意味着碰撞将在接近终点时接近100%,并且,如果有一天有10k+1个对象,碰撞将永远不会终止



一般来说,如果您想使用相对较短的ID空间,您需要一个非常有效的冲突检测系统,例如,将所有分配(或未分配)的值保留在草稿行中,或者放弃随机分配值并按顺序进行操作。

这是一个树。在插入时,你难道不知道你是否在复制一个现有的节点吗?@RobertHarvey我收到一个树,其中一些节点有ID,而另一些节点没有ID。我希望所有人都有唯一的ID。我将重新表述我的问题。您现有的树如何知道将每个节点放置在何处?@RobertHarvey我没有关于这些树最初是如何构建的信息。通过使用ID,我可以轻松地添加子/兄弟姐妹。为什么不遍历现有的树并构建一个新的树呢?它是一棵树。在插入时,你难道不知道你是否在复制一个现有的节点吗?@RobertHarvey我收到一个树,其中一些节点有ID,而另一些节点没有ID。我希望所有人都有唯一的ID。我将重新表述我的问题。您现有的树如何知道将每个节点放置在何处?@RobertHarvey我没有关于这些树最初是如何构建的信息。通过使用ID,我可以很容易地添加子/兄弟姐妹。为什么不遍历现有的树并构建一个新的树呢?这是一个有趣的,尽管很难阅读,而且在更大范围内非常缓慢,几乎无法使用的解决方案。@radulle你说的非常缓慢是什么意思?4位数字的最大值为10000,根据快速测试,在我的浏览器中,执行它需要25-40毫秒。你想要什么性能?当我试着运行它时,花了很多时间,Chrome被挂起,我必须重新检查,但如果我沿着这条路走下去,我必须在每棵树上做一次,然后将该数组保存在内存中,并在需要时移动它。也许ID生成不是一个真正的问题,而是在节点上执行的一些附加操作?我鼓励您使用来精确测量部分代码的执行时间。无论如何,如果您不想复制ID,那么您需要将已使用的ID存储在某个位置,并比较您已获取的ID是否已获取。或者,您需要根据需要覆盖所有ID,以便知道没有重复的ID。这是一个有趣的问题,尽管很难读取,而且在较大范围内速度非常慢,几乎无法使用的解决方案。@radulle你说的极慢是什么意思?4位数字的最大值为10000,根据快速测试,在我的浏览器中,执行它需要25-40毫秒。你想要什么性能?当我试着运行它时,花了很多时间,Chrome被挂起,我必须重新检查,但如果我沿着这条路走下去,我必须在每棵树上做一次,然后将该数组保存在内存中,并在需要时移动它。也许ID生成不是一个真正的问题,而是在节点上执行的一些附加操作?我鼓励你和我一起玩