【发布时间】:2009-12-04 02:51:16
【问题描述】:
我需要根据给定的路径和配置的资源域数量以确定的方式生成资源域前缀,并具有良好的分布。例如,如果您将路径“/script/site.js”传递给它,它会返回“res#”,其中“#”是介于 0 和配置的资源域数量之间的整数。
使用 C# 3.0。
到目前为止有这个:
var resourceDomainCount = 4;
var hasher = System.Security.Cryptography.SHA1.Create();
var paths = new [] {
"/App_Themes.0.1.433.232/images/buttonsBackgrounds.jpg",
"/App_Themes.0.1.433.232/images/blahblah.jpg",
"/App_Themes.0.1.433.232/images/pagebg.gif",
"/App_Themes.0.1.433.232/site.css",
"/script/site.js",
"/App_Themes.0.1.433.232/images/different.jpg",
"/App_Themes.0.1.433.232/images/shadows.jpg",
"/Handlers/ImageHandler.ashx?type=l&id=123&s=g&index=0",
"/Handlers/ImageHandler.ashx?type=l&id=234&s=g&index=0",
"/Handlers/ImageHandler.ashx?type=l&id=345&s=g&index=0",
"/Handlers/ImageHandler.ashx?type=p&id=MyProduct&s=g&index=0",
"/Handlers/ImageHandler.ashx?type=p&id=WineGreat&s=g&index=0",
"/Handlers/ImageHandler.ashx?type=p&id=YayYay&s=g&index=0"
};
foreach (var path in paths) {
var pathHash = hasher.ComputeHash(Encoding.ASCII.GetBytes(path));
var singleByteHash = pathHash.Aggregate(0, (a, b) => a ^ b);
var random = new Random((int)singleByteHash);
var resourceDomainIndex = random.Next(0, resourceDomainCount);
(resourceDomainIndex + ": " + path).Dump();
}
这会产生以下内容:
3:/App_Themes.0.1.433.232/images/buttonsBackgrounds.jpg
0: /App_Themes.0.1.433.232/images/blahblah.jpg
1:/App_Themes.0.1.433.232/images/pagebg.gif
1:/App_Themes.0.1.433.232/site.css
3:/script/site.js
1:/App_Themes.0.1.433.232/images/different.jpg
3:/App_Themes.0.1.433.232/images/shadows.jpg
1:/Handlers/ImageHandler.ashx?type=l&id=123&s=g&index=0
1:/Handlers/ImageHandler.ashx?type=l&id=234&s=g&index=0
0: /Handlers/ImageHandler.ashx?type=l&id=345&s=g&index=0
2:/Handlers/ImageHandler.ashx?type=p&id=MyProduct&s=g&index=0
1:/Handlers/ImageHandler.ashx?type=p&id=WineGreat&s=g&index=0
0: /Handlers/ImageHandler.ashx?type=p&id=YayYay&s=g&index=0
没有得到我想要的分布(那里只有一个 '2' 的实例)。
有数千个输入字符串一直在变化,路径将在运行时生成,例如:<a href="<%= GetPath("/script/site.js") %>">Link</a>
【问题讨论】: