【发布时间】:2009-10-05 19:09:42
【问题描述】:
有谁知道在 T-SQL 中生成类似 RNGCryptoServiceProvider 的随机数而无需注册任何 .NET 程序集的方法?
【问题讨论】:
标签: sql sql-server tsql random
有谁知道在 T-SQL 中生成类似 RNGCryptoServiceProvider 的随机数而无需注册任何 .NET 程序集的方法?
【问题讨论】:
标签: sql sql-server tsql random
SELECT CHECKSUM(NEWID()) 为您提供基于 GUID 的 32 位有符号整数。您可以以此为基础:这几乎是最好的 SQL 方式
您可以使用它来播种 RAND(因为 RAND 对于单个选择中的所有行都是相同的。
SELECT RAND(CHECKSUM(NEWID()))
有符号的 64 位整数:
SELECT CAST(CHECKSUM(NEWID()) as bigint) * CAST(CHECKSUM(NEWID()) as bigint)
通过一些玩耍,您可以强制转换和/或连接以获得 binary("multiples of 4") 等来构建一个字节数组......虽然我没有使用 RAND 东西直接模仿
【讨论】:
如果您必须生成cryptographycally secure random numbers(例如用于散列的盐),那么您应该使用 CLR 函数。校验和、guid 等对于加密操作并不安全。
最简单的解决方案是使用调用 RNGCryptoServiceProvider 的CLR scalar function。
请注意,许多 SQL Server crpto 函数(如 EncryptByKey)已经使用加密安全生成的盐对输入进行加盐(除了 RC4 算法上的 EncryptByKey,它在 SQL 中被破坏)。
【讨论】: