1 回答

TA贡献1875条经验 获得超5个赞
SQL 代码处理 16 位十六进制数字的块,因为这将表达式中使用的数值的长度限制为 64 位数字。
然后它将 16 位十六进制数转换为基数为 10,因此它可以转换为unsigned,执行 XOR 并进行位计数。XOR 是一个二元运算,因此 base-10 仅用于强制转换,如果 SQL 具有解析十六进制数的函数,则实际上并不需要。
在 Java 中,有一个名为BigInteger(您实际上正在使用它)的类可以处理任何长度的数字,因此可以这样完成:
public double ih_comparehash(String hash_1, String hash_2, int maxlen) {
int len = Math.min(hash_1.length() / 16, maxlen);
BigInteger num1 = new BigInteger(hash_1.substring(0, 16 * len), 16);
BigInteger num2 = new BigInteger(hash_2.substring(0, 16 * len), 16);
int bitcnt = num1.xor(num2).bitCount();
return ((64 * len) - bitcnt) * 100.0 / (64 * len);
}
如果您愿意,也可以使用等效的 Groovy 代码。
添加回答
举报