int server = (Math.abs(q.hashCode()) % solrLoadBalanceNumOfServers) + 1;
詹金斯警告我这个说明:
计算有符号32位哈希码的绝对值的错误尝试
此代码生成哈希码,然后计算该哈希码的绝对值。如果哈希码为Integer.MIN_VALUE
,那么结果也将为负(从Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUE
开始)。
2 ^ 32个字符串中有一个的hashCode为Integer.MIN_VALUE
,包括“polygenelubricants”“GydZG_”和“”DESIGNING WORKHOUSES“。
有谁知道为什么我得到这个计算绝对值的警告?
答案 0 :(得分:13)
警告本身解释了您收到警告的原因。
您在哈希码上调用Math.abs()
。整数从-2,147,483,648到2,147,483,647。由于最大值为2,147,483,647,Math.abs(-2,147,483,648)
返回-2,147,483,648,因为没有2,147,483,648。如果你的String哈希值编码为-2,147,483,648,那么server
变量将被赋值为负值,这可能导致查询被删除或服务崩溃。
不是这样做,而是先做模数,然后调用Math.abs()
。
int server = Math.abs(q.hashCode() % solrLoadBalanceNumOfServers) + 1;
答案 1 :(得分:3)
首先,错误可能来自FindBugs(link)而不是Jenkins本身。它只是在Jenkins中运行/显示。
Integer.MIN_VALUE = - (2 ^ 31)和Integer.MAX_VALUE = 2 ^ 31-1。因此,从纯粹的数学角度来看,Integer.MIN_VALUE的绝对值不等于Integer.MAX_VALUE。它很少会出现并可能导致问题,这就是它警告你的原因。