2014-09-18 79 views
-4

是否可以基於字符串生成僞隨機數字,這意味着特定的字符串總是會返回相同的數字?如何根據字符串生成一個隨機數?

+2

那麼它會不會是隨機的呢?並且,是的,這是可能的。你應該修改你的問題,詢問它是如何完成的,並縮小到一個特定的範圍,而不僅僅是問是否可能。 – 2014-09-18 18:09:34

+2

你在尋找哈希函數嗎? (如果是這樣,你想要一個使用Javascript還是PHP?你的問題被標記爲兩個......)但是,可能更重要的是,你爲什麼要這樣做?爲您的使用選擇正確的散列函數非常重要。 – 2014-09-18 18:10:46

+0

我需要在PHP中執行此操作,對於標記兩者都很抱歉,我的錯誤。我只想爲每個文件擴展名分配一個「隨機」顏色。例如,「.jpg」應始終指定相同的隨機顏色。我不知道我是否有意義。 – Tom 2014-09-18 18:19:21

回答

2

你需要的不是隨機,而是哈希函數。

哈希算法創建輸入數據的指紋。散列通常不可逆,即不能從散列重構數據。 (但是,如果算法存在缺陷,您可以生成衝突,但只要您沒有做任何與安​​全相關的事情,則無需擔心。)

不幸的是,沒有實施本機哈希算法在JS中,所以你必須實現你自己的。但是,這裏是一個SO帖子,顯示了一個實現:https://stackoverflow.com/a/7616484/3908235

而且,顯然有whole library with the implementation of common algorithms(感謝@MattGibson)。

+1

[CryptoJS有一組哈希](https://code.google.com/p/crypto-js/) – 2014-09-18 18:12:37

0

如果你想在PHP中這樣做,那麼你可以使用crc32。這不是隨機但它產生的數字會根據字符串的內容而有所不同。它不是100%保證兩個不同的字符串會產生不同的數字。

實施例:

$number = crc32("http://php.net/manual/en/function.crc32.php"); 

注意$number將是一個無符號的32位整數,但PHP解釋所有整數作爲帶符號的整數,該值可以32位環境之間被不同地表示 - 其可以返回負數和正數 - 和64位環境 - 這將只返回正數。

這是一個好主意,用printf輸出這些格式化輸出到HTML,

printf("%u", $number); 

爲了使各不同架構產生的值的比較,你也應該格式化使用sprintf字符串,剛需安全:

$numberToStoreShareOrCompare = sprintf("%u", $number);