假设您想要一组 1 到 2 位的十六进制数字,即 256 个数字。只需使用一个小集合来解决问题,但它适用于任何大小的字符串。
因此,在这种情况下,您有一个潜在 N
的或 256 个数字。您将为遇到的每条新数据记录“生成”一个新 ID。所以它开始并随机给你af
, then 1d
, then8a
等。
直接简单的方法是简单地按顺序生成所有数字,然后将它们洗牌,然后从集合中弹出。当您只有 256 个数字时,这可以正常工作。但是,如果您有数百万或数十亿个数字,这是不切实际的,因为您可能有大量生成的 ID 长时间未使用。我想避免这种情况。
所以我的问题是创建这样的唯一键字符串的最快方法是什么,而不是预先生成所有这些字符串,也不需要按顺序递增 1 或诸如此类。也就是说,密钥应该是看似随机的。
我可以想象的一种方法是使用 trie 来存储已经使用/生成的值。然后,当您要获得一个新值时,您会生成一个随机值,然后检查 trie 以查看它是否已被使用。我不知道如何判断它的效率如何,但是一旦你开始用完 ID 并且下降到集合中的最后几个 ID,它的性能似乎会非常糟糕。您将生成许多已经生成的 ID,并为每个 ID 遍历 trie,因此会很慢。
我想知道是否有更有效的方法来执行此操作,而无需提前生成它们。此外,数据记录不会用于确定 ID,因为记录可能非常大且非常复杂。
也许有一种方法可以一次随机遍历(并生成)一个 trie,并以这种方式生成 ID,因为您最终位于 trie 中一个唯一的随机位置。我不知道,也许是类似的东西。
另外,我对散列并不复杂,所以我不知道是否有任何好的方法。