Sql server 如何在JavaScript中为BigQuery实现T-SQL校验和()?

Sql server 如何在JavaScript中为BigQuery实现T-SQL校验和()?,sql-server,tsql,google-bigquery,hashcode,Sql Server,Tsql,Google Bigquery,Hashcode,我要寻找的最终结果是在BigQuery中使用。我会满足于有C/C++源代码进行翻译,但如果有人已经完成了这项工作,那么我很乐意使用它 或者,如果有人能想出一种方法,在Microsoft SQL Server中存储的字符串与BigQuery中的字符串之间创建等效的哈希代码,那么这也会对我有所帮助 更新:我在注释中通过HABO的链接找到了一些源代码,这些代码是用T-SQL编写的,用于执行相同的校验和,但我很难将其转换为JavaScript,因为JavaScript本身无法处理64位整数。我正在玩

我要寻找的最终结果是在BigQuery中使用。我会满足于有C/C++源代码进行翻译,但如果有人已经完成了这项工作,那么我很乐意使用它

或者,如果有人能想出一种方法,在Microsoft SQL Server中存储的字符串与BigQuery中的字符串之间创建等效的哈希代码,那么这也会对我有所帮助


  • 更新:我在注释中通过HABO的链接找到了一些源代码,这些代码是用T-SQL编写的,用于执行相同的校验和,但我很难将其转换为JavaScript,因为JavaScript本身无法处理64位整数。我正在玩一些小例子,发现该算法只适用于每个字节的低半字节
  • 更新2:我真的很好奇复制这个算法,我可以看到一些明确的模式,但我的大脑不能胜任将其提取到逆向工程解决方案的任务。我确实发现,
    BINARY\u CHECKSUM()
    CHECKSUM()
    返回不同的内容,因此对前者所做的工作对后者没有帮助

我花了一天的时间对其进行反向工程,首先转储单个ASCII字符和成对ASCII字符的所有结果。这表明每个字符都有自己独特的“异或码”,字母不分大小写都有相同的“异或码”。在这之后,算法非常简单:向左旋转4位,然后根据存储在查找表中的代码进行异或运算

var xorcode=[
0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31,
0, 33, 34, 35, 36, 37, 38, 39,  //  !"#$%&'
40, 41, 42, 43, 44, 45, 46, 47,  // ()*+,-./
132, 133, 134, 135, 136, 137, 138, 139,  // 01234567
140, 141, 48, 49, 50, 51, 52, 53, 54,  // 89:;?@
142、143、144、145、146、147、148、149、//ABCDEFGH
150151152153154155156157,//IJKLMNOP
158159160161162163164165,//qrstuvx
166、167、55、56、57、58、59、60、//YZ[\]^_`
142、143、144、145、146、147、148、149、//abcdefgh
150151152153154155156157,//ijklmnop
158159160161162163164165,//qrstuvx
166、167、61、62、63、64、65、66、//yz{124;}~
];
功能rol(x,n){
//模拟向左旋转移位(>>>保留符号位)
返回(x>(32-n));
}
函数校验和{
var校验和=0;
对于(变量i=0;i
有关更多信息,请参阅

免责声明:我只研究过与SQL Server中排序规则设置为
SQL\u Latin1\u General\u CP1\u CI\u AS
VARCHAR
字符串的兼容性。这不适用于多个列或整数,但我确信底层算法使用相同的代码,因此不难理解。它似乎也有所不同从DBFIDLE可能由于排序:…里程可能会有所不同


仅供参考,对于那些陷于T-SQL遗留模式的人,这里有一个C#实现,经过测试,对于我使用过的大多数字符串/整数来说都很不错:

public static int[] xorcodes = {
    0, 1, 2, 3, 4, 5, 6, 7,
    8, 9, 10, 11, 12, 13, 14, 15,
    16, 17, 18, 19, 20, 21, 22, 23,
    24, 25, 26, 27, 28, 29, 30, 31,
    0, 33, 34, 35, 36, 37, 38, 39,  //  !"#$%&'
    40, 41, 42, 43, 44, 45, 46, 47,  // ()*+,-./
    132, 133, 134, 135, 136, 137, 138, 139,  // 01234567
    140, 141, 48, 49, 50, 51, 52, 53, 54,  // 89:;<=>?@
    142, 143, 144, 145, 146, 147, 148, 149,  // ABCDEFGH
    150, 151, 152, 153, 154, 155, 156, 157,  // IJKLMNOP
    158, 159, 160, 161, 162, 163, 164, 165,  // QRSTUVWX
    166, 167, 55, 56, 57, 58, 59, 60,  // YZ[\]^_`
    142, 143, 144, 145, 146, 147, 148, 149,  // abcdefgh
    150, 151, 152, 153, 154, 155, 156, 157,  // ijklmnop
    158, 159, 160, 161, 162, 163, 164, 165,  // qrstuvwx
    166, 167, 61, 62, 63, 64, 65, 66,  // yz{|}~
};


public static int rol(int x, int n) {
    // simulate a rotate shift left (>>> preserves the sign bit)
    return ((int)x << n) | ((int)((uint)x >> (32 - n)));
}

public static int checksum(string s) {
    int checksum = 0; 
    for (var i = 0; i < s.Length; i++) {
        checksum = rol(checksum, 4);

        var c = ((int)s[i]);
        int xorcode = 0;
        if (c < xorcodes.Length) {
            xorcode = xorcodes[c];
        } 
        checksum ^= xorcode;
    }
    return checksum;
}
公共静态int[]xorcode={
0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31,
0, 33, 34, 35, 36, 37, 38, 39,  //  !"#$%&'
40, 41, 42, 43, 44, 45, 46, 47,  // ()*+,-./
132, 133, 134, 135, 136, 137, 138, 139,  // 01234567
140, 141, 48, 49, 50, 51, 52, 53, 54,  // 89:;?@
142、143、144、145、146、147、148、149、//ABCDEFGH
150151152153154155156157,//IJKLMNOP
158159160161162163164165,//qrstuvx
166、167、55、56、57、58、59、60、//YZ[\]^_`
142、143、144、145、146、147、148、149、//abcdefgh
150151152153154155156157,//ijklmnop
158159160161162163164165,//qrstuvx
166、167、61、62、63、64、65、66、//yz{124;}~
};
公共静态整数rol(整数x,整数n){
//模拟向左旋转移位(>>>保留符号位)
返回((int)x>(32-n));
}
公共静态整数校验和(字符串s){
整数校验和=0;
对于(变量i=0;i
可以帮助您确定算法。
校验和
是一种垃圾算法。最好的方法是也不要在T-SQL中使用它,而不是对其进行反向工程并进一步扩展其缺陷。SQL Server有
HASHBYTES
,可以访问更成熟的通用算法,如
SHA2_256
(尽管像MD5这样的算法也比
CHECKSUM
好)。请注意,要在字符串上计算准确的哈希值,需要就所使用的编码达成一致,这在不同语言中可能会很棘手。在T-SQL方面,最安全的方法是散列一个
NVARCHAR
,即使您的字符串数据是
VARCHAR
,因为这始终会为您提供UTF-16.Yep,所有人都同意,但它的神秘性现在让我上钩了。不管算法的有效性如何,它就在那里,它正在被使用,理解它肯定会有助于人们了解它。好吧,我只能祝你好运。我所知道的是,一旦我们知道为什么校验和('-a')=校验和('-a')=校验和('a')=校验和('a-'))
,世界就不会变得更好——充其量我们会更加确信为什么不应该使用它。事实上,当我在SQL Server Express上尝试这三种方法时,这三种方法的表现都不同。现在,
BINARY\u CHECKSUM()