2012-04-24 66 views
0

我正在爲我的博客製作一個匿名評論系統。我需要用戶從我創建的數組中隨機選擇一個用戶名,它有600個用戶名。我不能只是把它做成隨機的,因爲那時人們不知道它是否是同一個人發佈回覆,所以我給每個帖子一個1-9999之間的隨機生成的密鑰,使用我想要的密鑰和用戶ID做一些計算,以便通過該特定職位的人數保持一致。結果必須在1-600之內。基於兩個變量在一定範圍內生成一個int

類似:

user_id x foo(1-9999) = bar(1-600) 

感謝。

+3

RTFM:http://php.net/rand – 2012-04-24 00:54:12

+0

這將是一個隨機的int,我需要一個基於ID和隨機生成的postkey的常量。 – 2012-04-24 00:58:19

回答

1

你可能要找的是hash function。引用維基百科:

散列函數是任何算法或子例程,它將可變長度的大型數據集(稱爲鍵)映射到固定長度的較小數據集。

所以,你可以使用一個標準的哈希函數,以及模運算散列函數的輸出,進一步映射到您的用戶名範圍,就像這樣:

function anonymise($username, $post_key) { 
    $hash = hash("adler32", "$username/$post_key"); 
    $hash_decimal = base_convert($hash, 16, 10); 
    $anonymised_id = $hash_decimal % 600; 

    return $usernames[$anonymised_id]; 
} 
+0

雖然這會很好,如果我希望它們始終保持不變,但我需要它們根據postkey進行更改。 – 2012-04-24 01:19:11

+0

因此將帖子鍵連接到用戶名(編輯以反映) – 2012-04-24 01:26:23

0

那麼,你真正想要的是每個海報的唯一標識符?爲什麼不使用http://php.net/ip2long modded 600?

當然,你也必須做一些碰撞檢測。

0

你可以嘗試在concatinated id和post鍵上使用md5。它給你一個一致的32字節的散列。它實際上是一個十六進制字符串,所以你可以通過執行一個十六進制到int的轉換來輕鬆地將它變成一個數字。

編輯:根據您的反饋。你可以把生成的int和modulas分別乘以600.

+0

這會很酷,但我需要的結果總是在1-600之內。 – 2012-04-24 01:20:06

+0

只是模塊600.唯一的問題是,如果桶大小如此之小,獲得重複的機會就會更高。我已經更新了我的答案。 – iWantSimpleLife 2012-04-25 01:10:40

相關問題