我正在寻找的最终结果是使用T-SQL CHECKSUM在BigQuery中实现JavaScript UDF。我愿意让C / C ++源代码进行翻译,但是如果有人已经完成了这项工作,那么我很乐意使用它。
或者,如果有人可以想到一种在Microsoft SQL Server中存储的字符串与BigQuery中的字符串之间创建等效的哈希码的方法,那对我也有帮助。
BINARY_CHECKSUM()
和CHECKSUM()
返回的内容不同,因此前者所做的工作对后者没有帮助。我花了一天的时间进行逆向工程,首先要转储单个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了解更多信息。