Programming/MySQL,MariaDB

MySQL/MariaDB :: 중복 없는 난수 생성

고고마코드 2021. 12. 7. 21:02
반응형

예측 불가능한 중복없는 난수를 생성하여 테이블에 저장하는 프로시저 만들기


중복 없는 난수 UUID

SELECT UUID(), UUID(), UUID()
#30e6956e-5752-11ec-853f-6c2b59c11615
#30e69572-5752-11ec-853f-6c2b59c11615
#30e69574-5752-11ec-853f-6c2b59c11615

UUID를 통해 중복없는 난수를 생성할 수 있다.

UUID() 는 UUID 버전1의 값을 반환한다.

UUID 버전 1은 네트워크 랜 카드와 시간을 기반으로 유니크한 ID를 생성한다.

그렇기 때문에 위 코드 예시 중 (1-2-3-4-5) 로 가정했을 때 1번을 제외한 2,3,4,5 는 같은 수가 나온다.

네트워크 랜 카드와 시간을 기반으로 생성한 ID이기 때문에 예측 가능한 값이 나오게 된다.

MySQL 참조 매뉴얼에도 예측 불가능한 값을 원할 경우 다른 방법을 사용하라고 한다.


예측 불가능한 중복 없는 난수 MD5(UUID())

SELECT MD5(UUID()), MD5(UUID()), MD5(UUID())
#9fa918f7b246200b08b92156f58d109d
#28d07e01f04a3399a07b8ead3e0d4cd6
#cb42233d8aaae09e2ee0576813bed6d6

중복 없는 난수에 암호화를 더하면 예측이 불가능하다고 판단된다.

그래서 나는 이것을 활용해 내가 원하고자 하는 프로시저를 만들었다.


최종 코드

DELIMITER $$

DROP PROCEDURE IF EXISTS `USP_SerialTest`$$

CREATE PROCEDURE `USP_SerialTest`()
BEGIN
    DECLARE row_cnt INT DEFAULT 0;
    DECLARE serial_number VARCHAR(30) DEFAULT '';

    WHILE row_cnt = 0 DO
        SET serial_number = LEFT(MD5(UUID()), 30);

        INSERT IGNORE INTO serial_use(serial_number) VALUES (serial_number); 
        SET row_cnt = ROW_COUNT(); 
    END WHILE;

    SELECT serial_number AS serial_number;
END$$

DELIMITER ;

예측 불가능한 중복없는 난수를 생성하여 테이블에 저장하는 프로시저 만들기 끝.

반응형