如何在SQL中生成类似RNGCryptoServiceProvider的数字

时间:2009-10-05 19:09:43

标签: sql sql-server tsql random

有没有人知道如何在T-SQL中生成类似RNGCryptoServiceProvider的随机数,而无需注册任何.NET程序集?

2 个答案:

答案 0 :(得分:2)

SELECT CHECKSUM(NEWID())根据GUID为您提供32个有符号整数。您可以使用它作为基础:它几乎是最好的SQL方式

您可以使用它来播种RAND(因为RAND对于单个选择中的所有行都是相同的。

SELECT RAND(CHECKSUM(NEWID()))

带符号的64位整数:

SELECT CAST(CHECKSUM(NEWID()) as bigint) * CAST(CHECKSUM(NEWID()) as bigint)

随着一些游戏你可以转换和/或连接以获得二进制(“4的倍数”)等来构建一个字节数组...我虽然没有使用兰德的东西直接模仿

答案 1 :(得分:1)

如果你必须生成cryptographycally secure random numbers(就像用于散列的盐),那么你应该使用CLR函数。校验和,guid等对于加密操作是不安全的。

最简单的解决方案是使用调用RNGCryptoServiceProvider的CLR scalar function

请注意,许多SQL Server crpto函数(如EncryptByKey)已经使用加密安全生成的盐来对输入进行盐化(RC4算法上的EncryptByKey除外,这在SQL中已被破坏)。