如何在JavaScript中为BigQuery实现T-SQL CHECKSUM()?

问题描述 投票:-1回答:1

我正在寻找的最终结果是使用T-SQL CHECKSUM在BigQuery中实现JavaScript UDF。我愿意让C / C ++源代码进行翻译,但是如果有人已经完成了这项工作,那么我很乐意使用它。

或者,如果有人可以想到一种在Microsoft SQL Server中存储的字符串与BigQuery中的字符串之间创建等效的哈希码的方法,那对我也有帮助。


  • 更新:我已经在注释中通过HABO的链接找到了一些源代码,这些注释以T-SQL编写以执行相同的CHECKSUM,但是我很难将其转换为JavaScript,而JavaScript本质上无法处理64位整数。我正在处理一些小示例,发现该算法适用于每个字节的低字节only
  • 更新2:我对复制此算法感到非常好奇,我可以看到一些确定的模式,但是我的大脑无法完成将其提炼成反向工程解决方案的任务。我确实发现BINARY_CHECKSUM()CHECKSUM()返回的内容不同,因此前者所做的工作对后者没有帮助。
sql-server tsql google-bigquery hashcode
1个回答
0
投票

我花了一天的时间进行逆向工程,首先要转储单个ASCII字符以及成对的所有结果。这表明每个字符都有其自己独特的“ XOR代码”,并且字母大小写均相同。之后,该算法非常简单:将左移4位,并通过查找表中存储的代码进行异或运算。

var 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{|}~
];

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

function checksum(s) {
    var checksum = 0;
    for (var i = 0; i < s.length; i++) {
        checksum = rol(checksum, 4);

        var c = s.charCodeAt(i);
        var xorcode = 0;
        if (c < xorcodes.length) {
            xorcode = xorcodes[c];
        }
        checksum ^= xorcode;
    }
    return checksum;
};

请参阅https://github.com/neilodonuts/tsql-checksum-javascript了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.