【发布时间】:2014-03-16 14:01:37
【问题描述】:
我需要将此 c# 函数转换为 T-SQL UDF
我需要从数据库中获取嗡嗡声距离小于 x 的所有行 此功能只是解决方案的一部分。
csharp 函数为这 2 个哈希返回 40,而 t-sql 函数返回 52
14714557628763197901
15383788748848265778
public static ulong csharp_hamming_distance(ulong hash1, ulong hash2)
{
ulong x = hash1 ^ hash2;
const ulong m1 = 0x5555555555555555UL;
const ulong m2 = 0x3333333333333333UL;
const ulong h01 = 0x0101010101010101UL;
ulong m4 = 0x0f0f0f0f0f0f0f0fUL;
x -= (x >> 1) & m1;
x = (x & m2) + ((x >> 2) & m2);
x = (x + (x >> 4)) & m4;
return (x * h01) >> 56;
}
我有样品,但结果不一样。
create function HammingDistance1(@value1 char(8000), @value2 char(8000))
returns int
as
begin
declare @distance int
declare @i int
declare @len int
select @distance = 0,
@i =1,
@len = case when len(@value1) > len(@value2)
then len(@value1)
else len(@value2) end
if (@value1 is null) or (@value2 is null)
return null
while (@i <= @len)
select @distance = @distance +
case
when substring(@value1,@i,1) = substring(@value2,@i,1)
then 0
when substring(@value1,@i,1) < substring(@value2,@i,1)
then CAST(substring(@value2,@i,1) as smallint) - CAST(substring(@value1,@i,1) as smallint)
when substring(@value1,@i,1) > substring(@value2,@i,1)
then CAST(substring(@value1,@i,1) as smallint) - CAST(substring(@value2,@i,1) as smallint)
else 1 end,
@i = @i +1
return @distance
end
任何帮助将不胜感激
【问题讨论】:
-
为什么不把它作为一个 CLR UDF,大概将值作为
long(而不是ulong)传递并使用 -3732186444946353715 和 -3062955324861285838 作为输入? -
旁注:字符串汉明和二进制汉明是不同的;根据我的计算,这两个值之间的字符串汉明 as strings 是 18...你怎么得到 52?
-
谢谢!!如果我不必运行这样的查询 SELECT Id FROM InstagramPhoto WHERE dbo.HamDist( convert(varchar,convert(decimal(32,0),phash)), convert(varchar,convert(decimal(32,0), 15383788748848265778))) stackoverflow.com/questions/4777070/…
-
14714557628763197901不适合bigint;-3732186444946353715只是相同位模式的有符号(而不是无符号)解释(注意:负数,因为设置了 MSB)。
标签: c# sql tsql user-defined-functions hamming-distance