有点奇怪的问题。我有一个网站,其中包含一些经典ASP的页面,以及ASP.net中的其他页面。
我有一个脚本可以缓存他们的重力图像。它托管在无Cookie域上,位于以下位置之一:
http://static1.scirra.net
http://static2.scirra.net
http://static3.scirra.net
http://static4.scirra.net
当页面在我的 ASP.net 站点上请求一个gravatar时,它会通过此函数将其随机分发到静态服务器:
/// <summary>
/// Returns the static url for gravatar
/// </summary>
public static string GetGravatarURL(string Hash, int Size, int AuthorID)
{
Random rndNum = new Random(AuthorID);
int ServerID = rndNum.Next(0, 4)+1;
string R = "//static" + ServerID.ToString() + ".scirra.net/avatars/" + Size + "/" + Hash + ".png";
return R;
}
我的经典ASP 部分的功能是:
function ShowGravatar(Hash, AuthorID)
Dim ServerID
Randomize(AuthorID)
ServerID = Int((Rnd * 4) + 1)
ShowGravatar = "//static" & ServerID & ".scirra.net/avatars/" & intGravatarSize & "/" & Hash & ".png"
end function
它运行正常,它在用户ID上播种,然后为它们分配一个静态服务器来为它们的头像提供服务。唯一的问题是,C#和Classic ASP RNG的输出效果不同!这对于缓存来说不是最佳选择,因为在最多2个不同的域上提供相同的图像。
有什么简单的方法吗?
答案 0 :(得分:3)
返回可预测值的随机数生成器称为散列 - 可预测的随机性在随机数生成器中根本不酷: - )
所以,用一些哈希函数替换对rand的调用,你就完成了。使用你的想象力:哈希函数可以像authorid的crc的模4一样简单。
答案 1 :(得分:3)
为什么不直接使用gravatar哈希来确定服务器?例如,你可以取gravatar hash modulo 4的第一个字符。