我有一个环境,通过在夜间凌晨接收和发送数据,为3个时区的许多设备提供服务.基于标识号和使用模运算的简单计算伪随机地确定这些设备的分布.这种计算的结果造成了一个不必要的人为高峰,在夜间的某些时段消耗的资源比我想要的多.
作为我们协议的一部分,我可以指示设备何时在随后的夜晚连接到我们的系统.
我正在寻找一种算法,通常可以将峰值分配到更高级别的线(尽管通常在更多时候更高)或者至少在正确方向上推动 - 这意味着我应该花时间阅读什么类型的术语.我可以使用设备的识别号,当前时间和设备的时区作为执行计算的输入.我还可以执行一些前期分析计算来创建从中抽取插槽的池,虽然我觉得这种方法可能不如我希望的那么优雅(虽然学习算法可能不是一件坏事......).
(最终,有些不太相关,我将使用C#实现此算法.)
Pau*_*lan 12
如果要避免与使用随机时间相关的峰值,请查看用于哈希表的各种哈希函数.您的阅读可能从维基百科关于该主题的文章开始:
http://en.wikipedia.org/wiki/Hash_function
基本上,将您想要的更新窗口划分为适当数量的存储桶.一个选项可能是3小时*60分钟*60秒= 10800桶.然后将其用作哈希表大小,用于所选的散列函数.您的唯一输入可能是设备ID.不要忘记在选定的时间内使用GMT.您选择的编程语言可能具有许多内置的散列函数,但如果您想从头开始实现,那么本文应提供一些链接以帮助您入门.
这种方法优于早期的随机访问时间答案,因为它具有更好的均匀性,并且与随机函数(有时可能会出现峰值)相比,可确保您的访问模式大致平坦.
以下是有关如何实现各种功能的更具体信息:
http://www.partow.net/programming/hashfunctions/index.html