Created
August 17, 2015 08:25
-
-
Save qxj/5e99862a4180d0f3c539 to your computer and use it in GitHub Desktop.
分层实验的示例代码。原文见这里:http://blog.sina.com.cn/s/blog_e59371cc0102vopg.html ,但是其中代码格式错乱了,帮忙整理了一下。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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