美文网首页
默默hash(MurmurHash)

默默hash(MurmurHash)

作者: 黯淡这一切 | 来源:发表于2019-07-24 16:59 被阅读0次

MurmurHash可以将一个字符串hash出一个碰撞率极低的long型数值,且效率很高

package com.trs.util;

import java.nio.ByteBuffer;

import java.nio.ByteOrder;

/**

* 根据字符串生成long型数据id

* @author yush

* 2018年11月6日 上午11:02:00

*/

public class AssetKeyUtil {

    /**

    *  MurMurHash算法,是非加密HASH算法,性能很高,

    *  比传统的CRC32,MD5,SHA-1(这两个算法都是加密HASH算法,复杂度本身就很高,带来的性能上的损害也不可避免)

    *  等HASH算法要快很多,而且据说这个算法的碰撞率很低.

    */

    public static Long getMurMurHash(String key) {

        ByteBuffer buf = ByteBuffer.wrap(key.getBytes());

        int seed = 0x1234ABCD;

        ByteOrder byteOrder = buf.order();

        buf.order(ByteOrder.LITTLE_ENDIAN);

        long m = 0xc6a4a7935bd1e995L;

        int r = 47;

        long h = seed ^ (buf.remaining() * m);

        long k;

        while (buf.remaining() >= 8) {

            k = buf.getLong();

            k *= m;

            k ^= k >>> r;

            k *= m;

            h ^= k;

            h *= m;

        }

        if (buf.remaining() > 0) {

            ByteBuffer finish = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN);

            // for big-endian version, do this first: 

            // finish.position(8-buf.remaining()); 

            finish.put(buf).rewind();

            h ^= finish.getLong();

            h *= m;

        }

        h ^= h >>> r;

        h *= m;

        h ^= h >>> r;

        buf.order(byteOrder);

        return h;

    }

}

相关文章

网友评论

      本文标题:默默hash(MurmurHash)

      本文链接:https://www.haomeiwen.com/subject/iqcfrctx.html