为什么异或运算符会产生“无方法签名”错误消息和/或 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)

在 Script1$ih_comparehash.callCurrent(Unknown Source)

在 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


蓝山帝景
浏览 124回答 1
1回答

慕田峪4524236

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) {&nbsp; &nbsp; int len = Math.min(hash_1.length() / 16, maxlen);&nbsp; &nbsp; BigInteger num1 = new BigInteger(hash_1.substring(0, 16 * len), 16);&nbsp; &nbsp; BigInteger num2 = new BigInteger(hash_2.substring(0, 16 * len), 16);&nbsp; &nbsp; int bitcnt = num1.xor(num2).bitCount();&nbsp; &nbsp; return ((64 * len) - bitcnt) * 100.0 / (64 * len);}如果您愿意,也可以使用等效的 Groovy 代码。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java