정보 · 테크
Mysql rand 함수의 랜덤 값 Generator 만들기

아래 코드는 제가 mysql rand 함수의 소스 코드를 분석하여
랜덤 값 생성 알고리즘을 분석한 뒤 짠, 자바스크립트 코드입니다.

분석 과정을 설명하고 싶지만 아직 이미지 기능이 완전히 구비되어 있지 않아
나중에 보충하도록 하겠습니다.

class Random {
    constructor(seed1, seed2) {
        this.maxValue = 0x3FFFFFFF;
        this.seed1 = seed1 % this.maxValue;
        this.seed2 = seed2 % this.maxValue;
    }
}

class ItemFuncRand {
    constructor(arg, limit=10) {
        this.seedRandom(arg);
        this.limit = limit;
    }
    seedRandom(arg) {
        this.randSt = new Random(arg * 0x10001 + 55555555, arg * 0x10000001);
        this.arg = arg;
    }
    *myRnd() {
        const randSt = this.randSt;
        for(let i=0; i < this.limit; i++) {
            randSt.seed1 = (randSt.seed1 * 3 + randSt.seed2) % randSt.maxValue;
            randSt.seed2 = (randSt.seed1 + randSt.seed2 + 33) % randSt.maxValue;
            yield randSt.seed1 / randSt.maxValue;
        }
    }
    generate() {
        const gen = this.myRnd();
        console.log("Generate mysql's rand(%d) value %d times", this.arg, this.limit);
        for(let value of gen) {
            console.log(value);
        }
    }
}

클래스를 선언한 뒤

let rand = new ItemFuncRand(10)
rand.generate()

처럼 콘솔에 입력할 시

Generate mysql's rand(10) value 10 times
0.6570515219653505
0.12820613023657923
0.6698761160204896
0.9647622201263553
0.8141827833039526
0.17662728687434204
0.4405881151934975
0.6730587460781063
0.04352941554368419
0.19847087021774693

와 같이 랜덤 값을 올바르게 예측하는 것을 볼 수 있습니다.

올바른 랜덤 값인지 확인하는 방법은 mysql 콘솔에서
select rand(10) from (select 1 union select 2 ... select union select 10)t 과 같이 하시면 됩니다.

감사합니다.

#c #code_auditing #rand #javascript
작성자 정보