减少散列函数的范围,保持均匀分布

时间:2016-10-29 21:23:22

标签: c hash cron

我正在写一个类似cron的工作调度员,每分钟都会运行一次工作(以及每5分钟完成一次其他工作等)。但是,我不想立即调度在最后时刻在特定时间段内运行的所有作业,而是希望在它们的周期内均匀地生成它们。

例如,如果我有每两分钟运行的N个作业,而不是在P:00处全部生成它们,我想在P * 60秒内均匀地生成作业,即每个ceil(N/P*60)个作业第二。因此,每个工作的产生时间将是"倾斜"稍晚一点。

但是,对于每个作业J,我希望每次调度时都会在相同的偏差处生成J,这样J的生成之间的时间是恒定的(并匹配其周期) )。

每个作业都有与之相关的各种信息,包括每个作业不同的几个字符串。我最初的想法是计算一个或多个字符串的哈希码H,并用P * 60对其进行修改,以计算每个作业的常数偏差S.只要与作业关联的字符串保持不变,计算出的偏差就会保持不变。

但是,我认为S=H%(P*60)会受到problems similar to using rand()的影响(不均衡的分布偏向于较低的数字)。但是,我不认为那里提供的解决方案(多次调用rand())将适用于我使用哈希码的情况,因为给定作业的哈希函数总是如此返回相同的哈希。

那么我怎样才能得到我想要的东西? (我在C中写作。)

示例:

  1. 假设我每分钟有N个工作(* * * * *的cron时间表)。对于N< 60(让我们说2),然后作业1可能会倾向于开始于:23(分钟23秒)和作业-2可能会偏离以开始于:37。由于工作很少,它可能看起来不均匀。然而,当N接近60时,"差距"将填写(假设一个完美的偏斜函数),以便每秒产生一个工作。如果N超过60,那么在某些时间产生的一些工作将会加倍。"同样地,当N接近120时,"间隙"将再次填补,以便每秒产生两个工作。等等。

  2. 支持我每五分钟就有N个工作(*/5 * * * *的cron时间表)。在"正常" cron,这意味着"每五分钟就在五分之一的第二秒。"我相反希望这意味着"每隔五分钟,但不一定(并且很可能不是)在一些分钟的第二秒,但唯一的保证是产卵之间的间隔将是五分钟。"例如,某个特定的工作可能会在00:07:24,00:12:24,00:17:24等产生。当N接近300时,每秒会产生一个工作。

0 个答案:

没有答案