一、前言
Math.abs函数是jdk中提供的一个用来返回入参绝对值的函数,也就是你输入一个负数,它会返回其对应绝对值正数,这个在大部分情况下是这样,但是特殊情况下,还是会返回负数,为何那?且往下看。
二、场景介绍
在数据库中当数据量比较大时,我们会把一个表分为多个分表,或者把一个库分为多个库,那么分表按照什么来分那?这里就有一个分表键的概念,比如用户信息表,可以按照用户id作为分表键,比如消息重试表,可以使用消息id来做。
当分表键是字符串时候,我们可以使用字符串的hash值作为分表键。比如我们有100个分表,那么我们可使用hash(分表键)%100取模,根据取模后的值确定当前记录放到哪个分表。
但是字符串的hash值有可能是负数,所以我们需要使用Math.abs取分表键hash值的绝对值%100。这样看起来很好,但是还是会有问题。
因为字符串的hash值是int类型的,所以会取Math.abs(int a)作为取绝对值函数,当a为0x80000000时候,我们会看到其结果为:-2147483648,竟然为负数ÿ