class PulsarSdk::Producer::Router
Public Class Methods
new(scheme = :string_hash)
click to toggle source
# File lib/pulsar_sdk/producer/router.rb, line 6 def initialize(scheme = :string_hash) case scheme.to_sym when :string_hash @handler = string_hash when :murmur_hash @handler = murmur3_hash else raise "Unknown hash scheme #{scheme}" end end
Public Instance Methods
murmur3_hash()
click to toggle source
# File lib/pulsar_sdk/producer/router.rb, line 38 def murmur3_hash Proc.new do |key, seed = 31| # Using 0x7fffffff was maintain compatibility with values used in Java client Murmur3.hash(key, seed) & 0x7fffffff end end
route(key, total, delay = 0)
click to toggle source
# File lib/pulsar_sdk/producer/router.rb, line 17 def route(key, total, delay = 0) return 0 if total <= 1 return (@handler.call(key) % total) unless key.to_s.empty? Murmur3.int32_hash(TimeX.now.timestamp) % total end
string_hash()
click to toggle source
将hash值限制在32位内,防止key过长导致过多内存占用
# File lib/pulsar_sdk/producer/router.rb, line 26 def string_hash max_mod = 1 << 32 Proc.new do |key| h = 0 key.to_s.each_byte do |x| h = (31*h)%max_mod + x end h end end