Package org.apache.niolex.common.guava

Source Code of org.apache.niolex.common.guava.GuavaHashing$PersonFunnel

/**
* 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));
    }

}
TOP

Related Classes of org.apache.niolex.common.guava.GuavaHashing$PersonFunnel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.