Skip to content

Instantly share code, notes, and snippets.

@fl00r
Created April 12, 2012 09:06
Show Gist options
  • Save fl00r/2365746 to your computer and use it in GitHub Desktop.
Save fl00r/2365746 to your computer and use it in GitHub Desktop.
Server balancing by file ID
require 'digest/sha1'
#
# servers -> [3, 5, 8]
# история количеств серверов
#
def fetch_server_no(acc, servers)
while server = servers.pop do
last = servers.last.to_i
# Для более равномерного размазывания по серверам
rest = Digest::SHA1.hexdigest("#{acc}_#{server}").to_i(16) % server
rest = server if rest == 0
if last == 0 || rest > last
current = server - last
no = acc % current
no = current if no == 0
no += last
return no
end
end
end
servers = {}
(1..100000).each do |file|
no = fetch_server_no(file, [3,5,8,12,15,20])
servers[no] ||= 0
servers[no] += 1
end
servers.sort
# =>
# [[1, 4921],
# [2, 5008],
# [3, 4925],
# [4, 5130],
# [5, 4908],
# [6, 5124],
# [7, 4936],
# [8, 4962],
# [9, 5023],
# [10, 5081],
# [11, 5029],
# [12, 4840],
# [13, 5003],
# [14, 4967],
# [15, 4966],
# [16, 5006],
# [17, 5072],
# [18, 5013],
# [19, 5033],
# [20, 5053]]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment