2011-07-09 41 views
2

一个奇怪的问题的位。我有一个网站,其中有一些经典的ASP页面,以及其他的ASP.net。用C#随机数匹配一个经典的ASP随机数

我有一个缓存他们的gravatar图像的脚本。这是托管在一个使用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#和经典ASP RNG的输出结果不同!这对于缓存来说并不是最佳选择,因为同一图像在多达2个不同的域上提供。

任何简单的方法呢?

+2

作为一个旁注:请不要告诉人们你不会发布他们的电子邮件,然后使用gravatar。许多网站以这种方式对他们的用户说谎。 – CodesInChaos

+0

@Codeinchaos,你是什么意思?哈希基本上是匿名的,不是吗? –

+1

许多电子邮件地址都是低熵的,可以猜到。例如,我设法从gravatar hash中获得SO的20%以上的电子邮件地址,但计算能力更强,电子邮件生成算法更好,则应该有更高的百分比。 – CodesInChaos

回答

3

随机数发生器,它返回一个预测的值称为哈希 - 预测的随机性是不冷静,在所有随机数发生器:-)

所以,一些哈希函数调用替换到你兰特一切都准备好了。使用你的想象力:哈希函数可以像authorid的crc的模4一样简单。

+0

很好的答案! Mod 4 + 1似乎很好地工作:D –

3

为什么不使用gravatar散列来确定服务器?例如,你可以采取第一个字符的gravatar哈希模4。