랜덤 함수의 위조 랜덤

1676 단어
블로밍 필터의hash 함수 구현을 보았는데 랜덤 함수가 사용되었습니다.
protected int[] getHashIndexes(E obj) {
	int[] indexes = new int[numHashFunc];
	long seed = 0;
	byte[] digest;
	try {
	MessageDigest md = MessageDigest.getInstance(“MD5”);
	md.update(obj.toString().getBytes());
	digest = md.digest();
	for (int i = 0; i < 6; i++) {
	seed = seed | (((long)digest[i] & 0xFF))<<(8*i);
	}
	} catch (NoSuchAlgorithmException e) {}
	
	Random gen = new Random(seed);
	for (int i = 0; i < numHashFunc; i++) {
		indexes[i] = gen.nextInt(bitArraySize);
	}
	return indexes;
}

처음에는 해시 함수에서 랜덤 함수로hash값을 생성해야 한다는 의문도 있었다. 랜덤인 이상dd(A)와find(A)일 때 이hash함수를 호출해서 키를 생성해야 한다. 랜덤 함수가 존재하기 때문에 같은value로 생성된Key는 다르다. 그럼 이hash가 무슨 소용이 있겠는가?
나중에 랜덤 함수의 위조 랜덤 문제가 생각났다. 즉, 하나의 랜덤 함수가 같은seed(씨앗)를 정할 때 그 후속 같은 횟수에 생성된 랜덤 수는 같다. 왜냐하면 랜덤 함수의 실현은 모두seed를 기점으로 하여 다른 랜덤 수로 연산하기 때문이다.
다음은 C의 rand() 함수와 Java의 Random 클래스에 대한 실험입니다.
	srand(0);
	vector<int> lvFirstArray;
	for(int i = 0; i < 100; i ++)
		lvFirstArray.push_back(rand());  // 0 seed  100    

	srand(0);
	for(int i = 0; i < 100; i ++)
		assert(rand() == lvFirstArray[i]);//   0 seed  100         100      
교과서에 clock()을seed로 랜덤 수를 만들어야 하는 이유다.
import java.util.Random;
 
public class RandomDemo {
    
    public static void main(String[] args) {
        Random r1 = new Random(10);
        Random r2 = new Random(10);
        //      
        for (int i = 0; i < 2; i++) {
            System.out.println(r1.nextInt());
            System.out.println(r2.nextInt());
        }
    }
}

좋은 웹페이지 즐겨찾기