2011-07-09 43 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。