一致性哈希:MurmurHash

功能:

  • hash 获取指定数据的一致性hash值
源码:

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

/**
 * This is a very fast, non-cryptographic hash suitable for general hash-based
 * lookup. See http://murmurhash.googlepages.com/ for more details.
 * 

*

* The C version of MurmurHash 2.0 found at that site was ported to Java by * Andrzej Bialecki (ab at getopt org). *

*/ public class MurmurHash { private static final String UTF_8 = "UTF-8"; public static long hash64A(byte[] data, int seed) { return hash64A(ByteBuffer.wrap(data), seed); } public static long hash64A(ByteBuffer buf, int seed) { 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; } public long hash(byte[] key) { return hash64A(key, 0x1234ABCD); } public long hash(String key) { return hash(encode(key)); } private byte[] encode(String data) { try { return data.getBytes(UTF_8); } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException(e); } } }
用法:

public static void main(String[] args) {
        // 根据uid做分库分表
        String uid = "09cd3de4a570dc31e86234d04afbca7d";
        
        MurmurHash hash = new MurmurHash();
        long h = hash.hash(uid) / 10;
        //long h = 2209705902952448L;
        
        // DB
        long dbIndex = (h & 255) >>> 4;
        System.out.println(dbIndex);
        
        // TABLE
        long tableIndex = h & 255;
        System.out.println(tableIndex);
    }

你可能感兴趣的:(一致性哈希:MurmurHash)