algorithm - 为多个节点生成有限范围内的唯一数字

标签 algorithm numbers

我什至不确定以下是否可行,但问问总不会有坏处:

我有两个节点运行同一个应用程序。每台机器都需要一个序列生成器,该生成器会为其提供一个介于 0 和 1e6 之间的数字。如果一个节点已经使用了一个号码,则另一个节点不得使用它。发电机应在每晚午夜重置。任何号码都不应在同一天使用两次,即使机器重新启动也是如此。我们希望避免任何涉及数据库、分布式缓存或文件系统的解决方案。假设我们每天永远不需要超过 1e6 个数字。数字不必按顺序使用。

到目前为止,我们已经想到了以下内容:

1)机器A使用奇数,机器B使用偶数。

优点:没有共享状态。

缺点:机器可能会用完数字,但还有很多剩余。如果机器重新启动,它将重新使用以前使用过的号码。

2)机器A从0到1e6,机器B从1e6到0。

优点:没有共享状态。保证在遇到问题之前消耗所有可用数字。

缺点:不能扩展到超过两台机器。机器重启时出现同样的问题。

你怎么看?有没有一种神奇的算法可以满足我们的要求而不需要向磁盘写入任何内容?

最佳答案

No number should be used twice in the same day, even if a machine restarts.

由于您不想使用任何持久状态,这对我来说表明数字必须以某种方式取决于时间。这是算法可以区分两个不同初创公司的唯一方法。您不能只使用组合 (node, timestamp) 来获得足够精细的时间戳,而不是您的数字吗?

关于algorithm - 为多个节点生成有限范围内的唯一数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1487380/

相关文章:

c++ - 递归 Floodfill 段错误

android - 使用 Goertzel 算法处理音频信号的结果

c# - .NET List<T>.Sort 使用 introsort,为什么最坏的情况是 O(n^2)?

perl - 在 Perl 中如何判断变量是否具有数值?

numbers - 为什么在 LISP 中,没有数量限制?

algorithm - 在 Matlab 中通过遗传算法传递额外参数

algorithm - Ocaml作业需要一些建议

ruby-on-rails - 如何检查一个数字是否包含在一个范围内(在一个语句中)?

c++ - 如何确定一个数字的基数?

javascript - 在 Javascript 中,值 0/0 返回 NaN。但是为什么 typeof 运算符将这个值作为 Number 类型返回呢?