org.apache.niolex.common.guava.GuavaHashing.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.niolex.common.guava.GuavaHashing.java

Source

/**
 * GuavaHashing.java
 *
 * Copyright 2013 the original author or authors.
 *
 * We 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.niolex.common.guava;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnel;
import com.google.common.hash.HashCode;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
import com.google.common.hash.PrimitiveSink;

/**
 * @author <a href="mailto:xiejiyun@foxmail.com">Xie, Jiyun</a>
 * @version 1.0.0
 * @since 2013-5-10
 */
public class GuavaHashing {

    public static class Person {
        final int id;
        final String firstName;
        final String lastName;
        final int birthYear;

        public Person(int id, String firstName, String lastName, int birthYear) {
            super();
            this.id = id;
            this.firstName = firstName;
            this.lastName = lastName;
            this.birthYear = birthYear;
        }

        public int getId() {
            return this.id;
        }

        public String getFirstName() {
            return this.firstName;
        }

        public String getLastName() {
            return this.lastName;
        }

        public int getBirthYear() {
            return this.birthYear;
        }

    }

    public static class PersonFunnel implements Funnel<Person> {

        /**
         * Gen
         */
        private static final long serialVersionUID = -8662033253118318877L;
        private static final PersonFunnel INSTANCE = new PersonFunnel();

        /**
         * This is the override of super method.
         *
         * @see com.google.common.hash.Funnel#funnel(java.lang.Object, com.google.common.hash.PrimitiveSink)
         */
        @Override
        public void funnel(Person from, PrimitiveSink into) {
            into.putInt(from.id).putString(from.firstName).putChar('&').putString(from.lastName)
                    .putInt(from.birthYear);
        }

    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // Common Hash
        HashFunction hf = Hashing.goodFastHash(32);
        HashCode code = hf.hashObject(new Person(1, "Jiyun", "Xie", 1984), PersonFunnel.INSTANCE);
        System.out.println("Code1 => " + code.asInt());
        code = hf.hashObject(new Person(1, "Jiyun", "Xie", 1985), PersonFunnel.INSTANCE);
        System.out.println("Code2 => " + code.asInt());
        // Consistent Hashing
        HashFunction hf2 = Hashing.goodFastHash(64);
        code = hf2.hashObject(new Person(1, "Jiyun", "Xie", 1984), PersonFunnel.INSTANCE);
        System.out.println("Code3 => " + code.asLong());
        long hash = code.asLong();
        int bucket = Hashing.consistentHash(code, 100);
        System.out.println("Bucket1 => " + bucket);
        bucket = Hashing.consistentHash(hash, 101);
        System.out.println("Bucket2 => " + bucket);
        for (int i = 0; i < 10; ++i) {
            System.out.println("HashTo5 => " + Hashing.consistentHash(i, 5));
            System.out.println("HashTo6 => " + Hashing.consistentHash(i, 6));
        }
        // BloomFilter
        BloomFilter<Person> friends = BloomFilter.create(PersonFunnel.INSTANCE, 500, 0.02);
        for (int i = 0; i < 500; ++i) {
            friends.put(new Person(i, "Jiyun", "Xie", 1984 + i));
        }
        int k = 0;
        for (int i = 0; i < 500; ++i) {
            if (!friends.mightContain(new Person(i, "Jiyun", "Xie", 1984 + i))) {
                System.out.println("Error1 => " + i);
                ++k;
            }
        }
        System.out.println("fnp => (should be 0)" + ((double) k / 500));
        k = 0;
        for (int i = 0; i < 1000; i += 2) {
            if (friends.mightContain(new Person(i, "Jiyun", "Xie", 1984 + i))) {
                //System.out.println("Error2 => " + i);
                ++k;
            }
        }
        System.out.println("fpp => " + ((double) k / 500));
    }

}