2017-01-31 61 views
2
  1. 我想知道SQL Server 2005的確切算法RAND函數
  2. 邏輯中是否包含任何時間因素?

我已經在網上搜索並找不到任何細節。有些人認爲RAND函數不是完全隨機的,並且有足夠的樣本可以預測下一個函數。什麼是SQL Server Rand函數算法?

+1

這不是隨機的。它是[僞隨機](https://msdn.microsoft.com/en-us/library/ms177610.aspx)。它們是有區別的。 – GurV

+0

http://www.howtogeek.com/183051/htg-explains-how-computers-generate-random-numbers/ – Hemal

+1

https://ask.sqlservercentral.com/questions/2981/what-algorithm-does-rand- in-sql-server-use.html – crowchirp

回答

2

RAND()根據種子參數生成數字。

語法:RAND ([ seed ])

MSDN

  • 如果沒有指定種子,在SQL Server數據庫引擎隨機分配 種子值。
  • 對於指定的種子值,返回的結果總是相同的。
  • 對於一個連接,如果使用指定的種子值調用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。

+0

謝謝。雖然我沒有使用任何種子,但我只使用了RAND()函數。它仍然在場景後面使用靜態種子嗎? – Barsham

+0

@Barsham如果沒有指定種子,SQL服務器會分配一個「隨機」種子。我沒有找到關於這個種子是多麼隨機的文檔。但是我嘗試了不同的連接和服務器,沒有播種,我得到了不同的RAND()輸出,但是它仍然不能確認種子不會重複。這個種子被用於連接的生命期,因此在一個更長的生存連接中,黑客可能會採用您生成的RAND數字序列,並根據他們的隨機數據庫查找這些數字來猜測種子,然後預測下一個隨機數。可能這就是你的安全團隊所關心的? – HappyTown

+0

謝謝。但它並不能保證是可預測的。有可疑並不能證明。 – Barsham