为什么异或运算符会产生"No signature of method"错误消息和/或 bitCount() 需要什么格式才能通过?



我一直在尝试将SQL函数转换为Groovy,以便在Elastisearch中使用。但是我对java和groovy的了解是零,我一直在与所有错误作斗争,因为它们来了。

在这里解决了convertFromBaseToBase工作的第一个问题。但是现在我在XOR运算符方面遇到了问题。

很有可能,在 xor 部分之后会有更多的问题,所以我将预先发布完整的代码:

public static String convertFromBaseToBase (String str, int fromBase, int toBase){
return (new BigInteger(str, fromBase)).toString(toBase);
}
def ih_comparehash (String hash_1, String hash_2, int maxlen) { 
String hashpart1;
String hashpart2;
int bitcnt = 0
int strlen = 16
int len = 0
len = hash_1.length() / strlen
for (i = 0; i < len && i < maxlen; i++) {
hashpart1 = hash_1.substring((i * strlen) + 1, strlen);
hashpart2 = hash_2.substring((i * strlen) + 1, strlen);
cfbtb_1 = convertFromBaseToBase(hashpart1, 16, 10);
cfbtb_2 = convertFromBaseToBase(hashpart2, 16, 10);
bitcnt = bitcnt + (cfbtb_1 ^ cfbtb_2).bitCount();
}
return ((64 * i) - bitcnt) * 100.0 / (64 * i);
}
System.out.print(ih_comparehash("8f8f87878f8f8080", "50b0f878787a9f97", 1));

戳在: https://groovyconsole.appspot.com/script/5119420292661248

当前错误:

groovy.lang.MissingMethodException: 没有方法的签名: java.lang.Long.bitCount(( 适用于参数类型: (( 值: []
可能的解决方案: bitCount(long(at Script1.ih_comparehash(Script1.groovy:31(at Script1$ih_comparehash.callCurrent(Unknown Source(at Script1.run(Script1.groovy:40(


如果我完全错过了什么,这是我尝试转换为 Groovy 的 SQL 函数:

BEGIN
DECLARE hashpart1 varchar(64) DEFAULT "";
DECLARE hashpart2 varchar(64) DEFAULT "";
DECLARE bitcnt int DEFAULT 0;
DECLARE strlen int DEFAULT 16;
DECLARE i int DEFAULT 0;
DECLARE len int DEFAULT 0;
SET len = LENGTH(hash1) / strlen;
WHILE i<len AND i < maxlen DO
SET hashpart1 = SUBSTRING(hash1,(i*strlen)+1,strlen);
SET hashpart2 = SUBSTRING(hash2,(i*strlen)+1,strlen);
SET bitcnt = bitcnt + bit_count(cast(conv(hashpart1, 16, 10) as unsigned) ^ cast(conv(hashpart2, 16, 10) as unsigned));
SET i = i+1;
END WHILE;
RETURN ((64*i)-bitcnt)*100.0/(64*i);
END

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代码,如果你愿意的话。

最新更新