UP | HOME

Hash算法
发布于 5 06, 2020 by ThinkCat.

散列函数是将字符串或者数字作为输入,通过计算输出一个整数,理想的散列函数输出非常均匀分布在可能的输出域,特别是当输入非常相似的时候。

最近准备对线上的数据库进行分表的操作,整理方案的时候,看到最常用的还是采用对特定业务标识做 hash+mod 的方式。

于是也打算做这个方案,首要的是hash算法问题。有各种的实现,发现神器 guava 里面有一个 Hashing 类,包含 sha256, crc32, murmur3 等各种校验与hash实现。

测试下来,发现 murmur3 的版本中,会存在hash值是负数的情况,这种就取绝对值了。

public static void main(String[] args) {
    HashFunction hashFunction = Hashing.murmur3_128();
    long a = System.currentTimeMillis();
    int count = 0;
    for (int i = 0;i< 1000000;i++) {
        HashCode hashCode = hashFunction.hashInt(i);
        if (hashCode.asInt() < 0) {
            System.out.println("Found:" + i);
            count++;
        }
    }
    System.out.println("all:" + count);
    System.out.println(System.currentTimeMillis() - a);
}

散列函数介绍:

https://zh.wikipedia.org/wiki/%E6%95%A3%E5%88%97%E5%87%BD%E6%95%B8