0

我想在 T-SQL 中创建一个标量函数,它类似于 Java 中的那些。

命令式语言的标准实现是:

int hash = 0;
for (int i = 0; i < length; i++)
{
    hash = 31*hash + value[i];
}
return hash;

我在 tsql 中实现这一点并不是那么好,从我的 POV 来看,在 t-sql 中编写命令式代码是应该避免的。我想这可以使用 CTE 来完成?请=)

另外,我可以让它总是积极的,即当结果超过整数最大值时,它会超过 0 而不是整数最小值?让我们假设可能的参数数量(我的解决方案中特殊类的数量)并不是很大。假设它永远不会超过 1000,所以我确信即使使用 uint 也可以避免在这里发生冲突。


PS:如果有人对我需要这个做什么感兴趣,我可以解释一下,也许你可以提出一个更好的解决方案。我有一个带有integer标识列和一个varchar列的表'TypeFullName'- 这是我们 C# 解决方案中一个类的全名。

而且我需要编写一个脚本,手动将 ID 设置为函数依赖项TypeFullName(是的,打开该SET IDENTITY INSERT选项)。这样我就可以计算 ID,如果我知道类型名称的话。我知道这听起来像是一个设计糟糕的系统,而且很可能是这样,但相信我,我现在只需要这样做)

谢谢!

4

2 回答 2

1

阅读我关于 CheckSum 与 Hashbytes 的文章。( http://craftydba.com/?p=3005 )

它们是两个内置的 SQL Server 函数,它们将为您生成一个给定值的哈希键。一个比另一个更独特。

如果您仍有疑问,请询问。

真挚地

约翰

www.craftydba.com

PS:

转换为 int 或 big int 时,您会失去精度。只需将其保存为 GUID(16 字节十六进制)。

在此处输入图像描述

于 2013-09-26T12:04:02.997 回答
0

我在互联网上找到了一个解决方案并稍微更新了它以将输出限制为正数:

begin
declare @h bigint
set @h = 0
select @h = (@h*31 + ascii(substring(@str,X.pos,1)))%4294967296
   from (select top(len(@str)) 
             row_number() over (order by getdate()) as pos 
           from sys.all_objects) as X
if @h >= 2147483647 set @h = @h - 2147483647
return convert(int, @h)
end;

select top from sys.all_objects真的很hacky,但是(((至少它有效。

于 2013-09-26T13:06:07.370 回答