랜덤 함수의 위조 랜덤
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());
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.