Skip to content

Instantly share code, notes, and snippets.

@qxj
Created August 17, 2015 08:25
Show Gist options
  • Save qxj/5e99862a4180d0f3c539 to your computer and use it in GitHub Desktop.
Save qxj/5e99862a4180d0f3c539 to your computer and use it in GitHub Desktop.
分层实验的示例代码。原文见这里:http://blog.sina.com.cn/s/blog_e59371cc0102vopg.html ,但是其中代码格式错乱了,帮忙整理了一下。
// Overlapping Experiment Demo
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.LinkedList;
import java.util.List;
public class MultiLayerExperiment {
private static String byteArrayToHex(byte[] byteArray) {
char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
char[] resultCharArray = new char[byteArray.length * 2];
int index = 0;
for (byte b : byteArray) {
resultCharArray[index++] = hexDigits[b >>> 4 & 0xf];
resultCharArray[index++] = hexDigits[b & 0xf];
}
return new String(resultCharArray);
}
private static long splitBucket(MessageDigest md5, long val, String shuffle){
String key = String.valueOf(val) +((shuffle==null)?"":shuffle);
byte[] ret = md5.digest(key.getBytes());
String s = byteArrayToHex(ret) ;
long hash =Long.parseLong(s.substring(s.length() - 16, s.length() - 1), 16);
if(hash < 0){
hash = hash * (-1);
}
return hash ;
}
private static void exp(SecureRandom sr,MessageDigest md5,
final int LevelOneBucketNumm,
final int LevelTwoBucketNumm,
final int LevelThreeBucketNumm,
final int AllFlows,
String shuffleLevel1,
String shuffleLevel2,
String shuffleLevel3){
// 1st layer
System.out.println("==第1层实验 start!==");
int[] bucketlevel1 = new int[LevelOneBucketNumm];
for (int i=0; i<LevelOneBucketNumm; ++i) {
bucketlevel1[i] = 0;
}
List<Integer> level1bucket2 = new LinkedList<Integer>();
for(int i=0; i<AllFlows; ++i){
int cookie = sr.nextInt();
long hashValue = splitBucket(md5, cookie, shuffleLevel1);
int bucket =(int) (hashValue % LevelOneBucketNumm);
if(bucket == 2){
level1bucket2.add(cookie);
}
bucketlevel1[bucket]++;
}
for(int i=0; i<LevelOneBucketNumm; ++i){
System.out.println("1层" + i + "桶:" + bucketlevel1[i]);
}
System.out.println("==第1层实验 end!==");
// 2nd layer
System.out.println("==第1层2号桶流量到达第2层实验 start!==");
int[] bucketlevel2 = new int[LevelTwoBucketNumm];
for (int i=0; i<LevelTwoBucketNumm; ++i) {
bucketlevel2[i] = 0;
}
List<Integer> level2bucket2 = new LinkedList<Integer>();
for(int cookie : level1bucket2) {
long hashValue = splitBucket(md5, cookie, shuffleLevel2);
int bucket =(int) (hashValue % LevelTwoBucketNumm);
if(bucket == 2){
level2bucket2.add(cookie);
}
bucketlevel2[bucket]++;
}
for(int i=0; i<LevelTwoBucketNumm; ++i) {
System.out.println("2层" + i + "桶:" + bucketlevel2[i]);
}
System.out.println("==第1层2号桶流量到达第2层实验 end!==");
// 3rd layer
System.out.println("==第2层2号桶流量到达第3层实验 start!==");
int[] bucketlevel3 = new int[LevelThreeBucketNumm];
for (int i=0; i<LevelThreeBucketNumm; ++i) {
bucketlevel3[i] = 0;
}
for(int cookie : level2bucket2) {
long hashValue = splitBucket(md5, cookie, shuffleLevel3);
int bucket =(int) (hashValue % LevelThreeBucketNumm);
bucketlevel3[bucket]++;
}
for(int i=0; i<LevelThreeBucketNumm; ++i) {
System.out.println("3层" + i + "桶:" + bucketlevel3[i]);
}
System.out.println("==第2层2号桶流量到达第3层实验 end!==");
}
public static void main(String[] args) throws NoSuchAlgorithmException {
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
MessageDigest md5 = MessageDigest.getInstance("MD5");
exp(sr,md5,5,5,5,1000000,null,null,null);
System.out.println("=======================");
exp(sr,md5,5,5,5,1000000,"a","b","c");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment