【发布时间】:2011-09-26 02:02:01
【问题描述】:
目标:将服务器处理的每个 URL 映射到 0、1、2 或 3,尽可能均匀地分布。
虽然 ruby 的 String#hash 方法的 documentation 表示它将“根据字符串的长度和内容返回一个哈希”,但这显然不是全部。给定字符串的哈希值在解释器的调用中不一致:
$ irb
ruby-1.9.2-p180 :001 > "foo".hash
=> 360517580588231756
ruby-1.9.2-p180 :002 > ^D
$ irb
ruby-1.9.2-p180 :001 > "foo".hash
=> -2716152678666510148
这意味着特定字符串的哈希值可能在服务器之间有所不同。 Rails 在内部使用String#hash 将URL 路径映射到四个资产主机之一(如果应用程序的asset_host 是so configured),但是由于跨机器不一致,此功能的效率要低得多;不同的服务器可能会将相同的 URL 映射到不同的资产主机,从而降低缓存的有效性、使天空阴云密布、过早冷却茶杯、玷污其他优秀程序员的声誉。
您能否建议一种替代散列函数,该函数可以有效且快速地在典型应用的 URL 空间中分发散列,最好是生成 Fixnum 的散列函数,因为最后我想将其映射到四个资产主机之一?
【问题讨论】:
-
只是想知道,你有没有找到一个好的解决方案?
-
CRC 可能是一个很好的解决方案 - 请参阅 stackoverflow.com/questions/4452161/…
标签: ruby ruby-on-rails-3 hash