3

我的网站使用来自单个域的各种资源,例如:

http://static.example.com/javascript/common.js
http://static.example.com/javascript/common.css
http://static.example.com/javascript/menu/menu.js
http://static.example.com/javascript/menu/menu.css
http://static.example.com/images/1804/logo/02000100.jpg
http://static.example.com/images/1804/headers/main/09400060.png
http://static.example.com/images/1804/headers/home/1101/06900200-01.jpg
http://static.example.com/images/1804/headers/home/1101/06900200-02.jpg

我需要一个非常简单的字符串散列函数,将这些 URL 映射到数字,数字是 0、1、2 和 3。算法应该是确定性和统一的。我已标记问题 PHP,但可以接受通用答案。

你可能已经猜到我为什么需要这个了;我计划将 URL 更改为,例如:

http://0.static.example.com/javascript/common.js
http://2.static.example.com/javascript/common.css
4

2 回答 2

2

我更喜欢crc32对字符串进行哈希处理,并将其与限制取模。

代码:

function numeric_hash($str, $range) {
    return sprintf("%u", crc32($str)) % $range;
}

用法:

$str = "http://static.example.com/javascript/common.js
http://static.example.com/javascript/common.css
http://static.example.com/javascript/menu/menu.js
http://static.example.com/javascript/menu/menu.css
http://static.example.com/images/1804/logo/02000100.jpg
http://static.example.com/images/1804/headers/main/09400060.png
http://static.example.com/images/1804/headers/home/1101/06900200-01.jpg
http://static.example.com/images/1804/headers/home/1101/06900200-02.jpg";
$urls = explode("\n", $str);

foreach($urls as $url) {
    echo numeric_hash($url, 4) . "\n";
}

输出:

1
3
3
3
1
3
1
3
于 2012-11-16T10:29:31.217 回答
1

如果你有很多 URL,你应该只是一个强大的散列,然后采取mod <noBuckets>

MD5(URL) % 4

如果您的 URL 很少,或者您的大小或调用频率不均匀,则“随机”分布可能会很糟糕,您应该只创建四个列表并将您的 URL 静态分配给每个列表,无论是手动还是使用基于每个 URL 的请求数的启发式方法.

于 2012-11-16T10:27:50.910 回答