- 我想知道SQL Server 2005的確切算法
RAND
函數 - 邏輯中是否包含任何時間因素?
我已經在網上搜索並找不到任何細節。有些人認爲RAND
函數不是完全隨機的,並且有足夠的樣本可以預測下一個函數。什麼是SQL Server Rand函數算法?
RAND
函數我已經在網上搜索並找不到任何細節。有些人認爲RAND
函數不是完全隨機的,並且有足夠的樣本可以預測下一個函數。什麼是SQL Server Rand函數算法?
RAND()
根據種子參數生成數字。
語法:RAND ([ seed ])
每MSDN,
RAND()
,則所有後續調用RAND()
都會根據種子RAND()
調用產生結果。例如,如果你(在不同的時間,甚至在多個數據庫或數據庫服務器)在運行多個連接的代碼
SELECT RAND(100), RAND(), RAND()
你會得到相同的結果,如下。
(No column name) (No column name) (No column name)
0.715436657367485 0.28463380767982 0.0131039082850364
所以,如果某人可以預測你使用的種子值,他們可能能夠猜測結果隨機數。
應該確認RAND()
絕對不會使用時間或mac地址類型的輸入到算法中。
This page at sql-server-helper.com建議使用NEWID()
作爲生成唯一隨機數的更好方法。但是NEWID()在SQL 2008或更高版本中可用。
SELECT ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber]
聲明:我沒有關聯www.sql-server-helper.com。
謝謝。雖然我沒有使用任何種子,但我只使用了RAND()函數。它仍然在場景後面使用靜態種子嗎? – Barsham
@Barsham如果沒有指定種子,SQL服務器會分配一個「隨機」種子。我沒有找到關於這個種子是多麼隨機的文檔。但是我嘗試了不同的連接和服務器,沒有播種,我得到了不同的RAND()輸出,但是它仍然不能確認種子不會重複。這個種子被用於連接的生命期,因此在一個更長的生存連接中,黑客可能會採用您生成的RAND數字序列,並根據他們的隨機數據庫查找這些數字來猜測種子,然後預測下一個隨機數。可能這就是你的安全團隊所關心的? – HappyTown
謝謝。但它並不能保證是可預測的。有可疑並不能證明。 – Barsham
這不是隨機的。它是[僞隨機](https://msdn.microsoft.com/en-us/library/ms177610.aspx)。它們是有區別的。 – GurV
http://www.howtogeek.com/183051/htg-explains-how-computers-generate-random-numbers/ – Hemal
https://ask.sqlservercentral.com/questions/2981/what-algorithm-does-rand- in-sql-server-use.html – crowchirp