我正在尝试在SQL中实现一种特殊的散列算法来解除对某些数据的散列。我快到了,但我最后一步陷入困境。
在SQL中尝试这段代码:
SELECT CAST(2912047312 AS BIGINT) & CAST(2912047312 AS BIGINT)
给了我2912047312
但是在JavaScript中使用以下代码:
console.log(2912047312 & 2912047312);
结果将为-1382919984
我在SQL中做错了什么,请阅读已经完成转换为bigint的必要性,但操作总是返回相同的值。
SQL数据库:SQL Server 2008 10.50.6000
答案 0 :(得分:2)
<强>的Javascript 强>
执行按位操作时Javascript is using 32 bit signed integers(因为Tom已将其链接起来)。由于您的值大于32位整数的最大值,因此只会使用整数的下半部分(这是因为溢出)。
您可以通过执行一个简单的测试来测试它:console.log(2912047312 | 0)
,它会打印-1382919984
。
2912047312 & 2912047312
表达式中的两个操作数将转换为32位整数,因此将对-1382919984 & -1382919984
表达式执行实际的按位操作。
有符号整数的范围是−2147483648
到+2147483647
。
SQL Server
SQL Server can perform bitwise operation on any integer type operands,包括bigint,因此结果将在更大的数据类型上计算,不会发生溢出。
所以区别在于两个系统在按位运算中使用不同的数据类型,其中一个系统无法处理您提供的值而没有溢出,因此不会更改实际值。
修改强>
你可以效仿&#39;用一个小技巧溢出:
SELECT (-2147483648 + (CAST(2912047312 AS BIGINT) & CAST(2147483647 AS BIGINT)));
CAST(2912047312 AS BIGINT) & CAST(2147483647 AS BIGINT)
部分将丢弃64位整数值的上半部分(高32位为0,低位32位为2147483647值的1,这是使用32位整数的最大值)。
然后它会将结果添加到带符号的32位整数(-2147483648)的最小值。