将经典ASP随机数与C#随机数匹配

时间:2011-07-09 14:01:03

标签: c# caching random asp-classic

有点奇怪的问题。我有一个网站,其中包含一些经典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个不同的域上提供相同的图像。

有什么简单的方法吗?

2 个答案:

答案 0 :(得分:3)

返回可预测值的随机数生成器称为散列 - 可预测的随机性在随机数生成器中根本不酷: - )

所以,用一些哈希函数替换对rand的调用,你就完成了。使用你的想象力:哈希函数可以像authorid的crc的模4一样简单。

答案 1 :(得分:3)

为什么不直接使用gravatar哈希来确定服务器?例如,你可以取gravatar hash modulo 4的第一个字符。