package edu.uw.cse.netlab.reputation.storage;
import java.io.ByteArrayOutputStream;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import org.gudy.azureus2.core3.util.ByteFormatter;
import edu.uw.cse.netlab.utils.BloomFilter;
import edu.uw.cse.netlab.utils.KeyManipulation;
/**
*
* This bundles together the bloom filter as well as a current topK set.
*
*/
public class LocalTopK
{
BloomFilter mBF = null;
PublicKey [] mKeys = null; // by occurrences
public LocalTopK( PublicKey [] inKeys )
{
mKeys = inKeys;
compute_bf();
}
public static BloomFilter createTopK_BF(int inKeysToStore)
{
try {
return new BloomFilter(8192*3, Math.max(Math.min(inKeysToStore, 2000), 2000));
}
catch( NoSuchAlgorithmException e )
{
e.printStackTrace();
}
return null;
}
private void compute_bf()
{
mBF = LocalTopK.createTopK_BF(mKeys.length);
for( PublicKey k : mKeys )
{
mBF.insert(k.getEncoded());
System.out.println("inserting key: " + ByteFormatter.encodeString(k.getEncoded()) );
if( mBF.test(k.getEncoded()) == false )
System.err.println("******** lookup failed for key we just inserted");
}
}
public PublicKey [] getKeys() { return mKeys; }
public BloomFilter getBloomFilter() { return mBF; }
public String toString()
{
StringBuilder sb = new StringBuilder("[TopK] " + mBF.toString());
for( PublicKey k : mKeys )
{
try
{
sb.append("\n" + KeyManipulation.concise(k.getEncoded()) + " (" + ReputationDAO.get().get_internal_id(k) + ")");
} catch( Exception e ) {}
}
return sb.toString();
}
}