| /* |
| * 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. |
| */ |
| package org.apache.drill.exec.expr.fn.impl; |
| |
| import io.netty.buffer.DrillBuf; |
| |
| import java.nio.ByteBuffer; |
| import java.nio.ByteOrder; |
| |
| public class HashHelper { |
| |
| /** taken from mahout **/ |
| public static int hash(ByteBuffer buf, int seed) { |
| // save byte order for later restoration |
| |
| int m = 0x5bd1e995; |
| int r = 24; |
| |
| int h = seed ^ buf.remaining(); |
| |
| while (buf.remaining() >= 4) { |
| int k = buf.getInt(); |
| |
| k *= m; |
| k ^= k >>> r; |
| k *= m; |
| |
| h *= m; |
| h ^= k; |
| } |
| |
| if (buf.remaining() > 0) { |
| ByteBuffer finish = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN); |
| // for big-endian version, use this first: |
| // finish.position(4-buf.remaining()); |
| finish.put(buf).rewind(); |
| h ^= finish.getInt(); |
| h *= m; |
| } |
| |
| h ^= h >>> 13; |
| h *= m; |
| h ^= h >>> 15; |
| |
| return h; |
| } |
| |
| public static int hash32(int val, long seed) { |
| double converted = val; |
| return hash32(converted, seed); |
| } |
| public static int hash32(long val, long seed) { |
| double converted = val; |
| return hash32(converted, seed); |
| } |
| public static int hash32(float val, long seed){ |
| double converted = val; |
| return hash32(converted, seed); |
| } |
| |
| |
| public static long hash64(float val, long seed){ |
| double converted = val; |
| return hash64(converted, seed); |
| } |
| public static long hash64(long val, long seed){ |
| double converted = val; |
| return hash64(converted, seed); |
| } |
| |
| public static long hash64(double val, long seed){ |
| return MurmurHash3.hash64(val, (int)seed); |
| } |
| |
| public static long hash64(long start, long end, DrillBuf buffer, long seed){ |
| return MurmurHash3.hash64(start, end, buffer, (int)seed); |
| } |
| |
| public static int hash32(double val, long seed) { |
| //return com.google.common.hash.Hashing.murmur3_128().hashLong(Double.doubleToLongBits(val)).asInt(); |
| return MurmurHash3.hash32(val, (int)seed); |
| } |
| |
| public static int hash32(int start, int end, DrillBuf buffer, int seed){ |
| return MurmurHash3.hash32(start, end, buffer, seed); |
| } |
| |
| } |
| |