Wednesday 29 November 2017

Java Program to Implement Bloom Filter


Code:

import java.util.*;    
import java.security.*;
import java.math.*;
import java.nio.*;

/* Class BloomFilter */
class BloomFilter
{    
    private byte[] set;
    private int keySize, setSize, size;
    private MessageDigest md;

    /* Constructor */
    public BloomFilter(int capacity, int k)
    {
        setSize = capacity;
        set = new byte[setSize];
        keySize = k;
        size = 0;
        try 
        {
            md = MessageDigest.getInstance("MD5");
        } 
        catch (NoSuchAlgorithmException e) 
        {
            throw new IllegalArgumentException("Error : MD5 Hash not found");
        }
    }
    /* Function to clear bloom set */
    public void makeEmpty()
    {
        set = new byte[setSize];
        size = 0;
        try 
        {
            md = MessageDigest.getInstance("MD5");
        } 
        catch (NoSuchAlgorithmException e) 
        {
            throw new IllegalArgumentException("Error : MD5 Hash not found");
        }
    }
    /* Function to check is empty */
    public boolean isEmpty()
    {
        return size == 0;
    }
    /* Function to get size of objects added */
    public int getSize()
    {
        return size;
    }
    /* Function to get hash - MD5 */
    private int getHash(int i)
    {
        md.reset();
        byte[] bytes = ByteBuffer.allocate(4).putInt(i).array();
        md.update(bytes, 0, bytes.length);
        return Math.abs(new BigInteger(1, md.digest()).intValue()) % (set.length - 1);
    }
    /* Function to add an object */
    public void add(Object obj)
    {
        int[] tmpset = getSetArray(obj);
        for (int i : tmpset)
            set[i] = 1;
        size++;
    }
    /* Function to check is an object is present */
    public boolean contains(Object obj) 
    {
        int[] tmpset = getSetArray(obj);
        for (int i : tmpset)
            if (set[i] != 1)
                return false;
        return true;
    }
    /* Function to get set array for an object */
    private int[] getSetArray(Object obj)
    {
        int[] tmpset = new int[keySize];
        tmpset[0] = getHash(obj.hashCode());
        for (int i = 1; i < keySize; i++)
            tmpset[i] = (getHash(tmpset[i - 1]));
        return tmpset;
    }    
}

/* Class BloomFilterTest */
public class BloomFilterTest
{
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        System.out.println("Bloom Filter Test\n");   

        System.out.println("Enter set capacity and key size");
        BloomFilter bf = new BloomFilter(scan.nextInt() , scan.nextInt());

        char ch;
        /*  Perform bloom filter operations  */
        do    
        {
            System.out.println("\nBloomFilter Operations\n");
            System.out.println("1. insert ");
            System.out.println("2. contains");
            System.out.println("3. check empty");
            System.out.println("4. clear");
            System.out.println("5. size");

            int choice = scan.nextInt();            
            switch (choice)
            {
            case 1 : 
                System.out.println("Enter integer element to insert");
                bf.add( new Integer(scan.nextInt()) );                     
                break;                          
            case 2 : 
                System.out.println("Enter integer element to search");
                System.out.println("Search result : "+ bf.contains( new Integer(scan.nextInt()) ));
                break;                                          
            case 3 : 
                System.out.println("Empty status = "+ bf.isEmpty());
                break;
            case 4 : 
                System.out.println("\nBloom set Cleared");
                bf.makeEmpty();
                break;    
            case 5 : 
                System.out.println("\nSize = "+ bf.getSize() );
                break;            
            default : 
                System.out.println("Wrong Entry \n ");
                break;   
            }    

            System.out.println("\nDo you want to continue (Type y or n) \n");
            ch = scan.next().charAt(0);                        
        } while (ch == 'Y'|| ch == 'y');    
    }
}


Output:

Bloom Filter Test

Enter set capacity and key size
1000 1000

BloomFilter Operations

1. insert
2. contains
3. check empty
4. clear
5. size
1
Enter integer element to insert
57

Do you want to continue (Type y or n)

y

BloomFilter Operations

1. insert
2. contains
3. check empty
4. clear
5. size
1
Enter integer element to insert
97

Do you want to continue (Type y or n)

y

BloomFilter Operations

1. insert
2. contains
3. check empty
4. clear
5. size
1
Enter integer element to insert
91

Do you want to continue (Type y or n)

y

BloomFilter Operations

1. insert
2. contains
3. check empty
4. clear
5. size
1
Enter integer element to insert
23

Do you want to continue (Type y or n)

y

BloomFilter Operations

1. insert
2. contains
3. check empty
4. clear
5. size
1
Enter integer element to insert
67

Do you want to continue (Type y or n)

y

BloomFilter Operations

1. insert
2. contains
3. check empty
4. clear
5. size
2
Enter integer element to search
67
Search result : true

Do you want to continue (Type y or n)

y

BloomFilter Operations

1. insert
2. contains
3. check empty
4. clear
5. size
2
Enter integer element to search
25
Search result : false

Do you want to continue (Type y or n)

y

BloomFilter Operations

1. insert
2. contains
3. check empty
4. clear
5. size
2
Enter integer element to search
33
Search result : false

Do you want to continue (Type y or n)

y

BloomFilter Operations

1. insert
2. contains
3. check empty
4. clear
5. size
2
Enter integer element to search
97
Search result : true

Do you want to continue (Type y or n)

y

BloomFilter Operations

1. insert
2. contains
3. check empty
4. clear
5. size
5

Size = 5

Do you want to continue (Type y or n)

y

BloomFilter Operations

1. insert
2. contains
3. check empty
4. clear
5. size
4

Bloom set Cleared

Do you want to continue (Type y or n)

y

BloomFilter Operations

1. insert
2. contains
3. check empty
4. clear
5. size
3
Empty status = true

Do you want to continue (Type y or n)

n



More Java Programs:



















100+ Best Home Decoration Ideas For Christmas Day 2019 To Make Home Beautiful

Best gifts for Christmas Day | Greeting cards for Christmas Day | Gift your children a new gift on Christmas day This Christmas d...