我花了一天的时间进行反向工程,首先将所有结果转储为单个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,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,// abcdefgh
150,// ijklmnop
158,// qrstuvwx
166,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。
免责声明:我只在与排序规则设置为VARCHAR
的SQL Server中的SQL_Latin1_General_CP1_CI_AS
字符串兼容。这不适用于多列或整数,但是我确定基础算法使用相同的代码,因此不难发现。由于归类,它似乎也与db fiddle有所不同:https://github.com/neilodonuts/tsql-checksum-javascript/blob/master/data/dbfiddle-differences.png ...里程可能有所不同!
,
fyi,对于那些陷入T-SQL传统模式的人来说,这是一个经过测试的C#实现,对于我一直在使用的大多数字符串/ int来说看起来都很不错:
public static int[] xorcodes = {
0,// 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;
}
本文链接:https://www.f2er.com/3056190.html