개발
온라인 UUID 생성기 제작 및 비화
가끔 업무를 하다가 대량의 uuid를 만들어야 하는 경우가 발생한다.
나같은 경우는 게시글 데이터 이전을 할때 새로운 게시글 구조에서는 기존에 사용하지 않는 uuid 방식으로 고유값을 이용하는데, 보통 이전 db구조에서 그런걸 쓰지않다보니 개수에 맞게 uuid를 만들어야 하는 경우가 종종 있다.
그럴때 일반적으로 쿼리문을 통해서 uuid를 만드는경우도있는데, 직접 데이터베이스를 열어 uuid 배열을 넣는경우도 발생한다.
이때 보통 온라인에서 uuid를 생성해주는 사이트를 찾아 이용하는데, 나도 이런 페이지가 내 사이트에 있으면 좋을거 같아서 관련 지식을 찾아 GPT와 함께 아래처럼 만들어보았다.


UUID 생성기
https://erulabo.com/uuid-generator
uuid는 아래와 같이 버전별 특징이 존재한다.
버전 | 특징 |
---|---|
v1 | Timestamp + MAC Address |
v3 | MD5 + 네임스페이스 |
v4 | Random |
v5 | SHA1 + 네임스페이스 |
v6~8 | 최신 RFC |
주로사용하는건 1버전과 4버전이다.
uuid는 RFC4122 구조 규칙을 준수하고 버전별 생성규칙을 따라 생성된다.
나는 이걸 온라인상에서 구현해야하므로 완전랜덤구현이 가능한 버전4와 MAC 주소를 랜덤값으로 대체한 버전1을 자바스크립트로 구현해보았다.
function uuidv4() {
// RFC4122-compliant UUID v4
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
const r = Math.random() * 16 | 0;
const v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
function uuidv1() {
const timeLow = Date.now().toString(16).padStart(8, '0').slice(-8);
const timeMid = Math.floor(Math.random() * 0xffff).toString(16).padStart(4, '0');
const timeHighAndVersion = (0x1000 | (Math.floor(Math.random() * 0x0fff))).toString(16); // version 1
const clockSeq = (0x80 | Math.floor(Math.random() * 0x3f)).toString(16).padStart(2, '0') +
Math.floor(Math.random() * 0xff).toString(16).padStart(2, '0');
const node = Array.from({ length: 6 }, () =>
Math.floor(Math.random() * 256).toString(16).padStart(2, '0')
).join('');
return `${timeLow}-${timeMid}-${timeHighAndVersion}-${clockSeq}-${node}`;
}
Copy
UUID의 특징은 세번째 세그먼트(블록)의 첫번째 글자가 버전을 나타낸다는 것이다.
그이외의 값은 각자의 규칙에 맞게 위에처럼 채워진다.
그리고 이를 주어진 설정값과 출력 설정을 기반으로 아래처럼 구현하면 자바스크립트로 쉽게 uuid 대량데이터를 생성할 수 있다.
function generateUUIDs() {
const type = document.querySelector('input[name="type"]:checked')?.value;
const isUppercase = document.querySelector('input[name="case"]:checked')?.value === '2';
const countInput = document.querySelector('.ps_input input[type="text"]');
const count = Math.max(1, Math.min(parseInt(countInput.value || '10'), 1000));
const resultDiv = document.getElementById('result');
const uuids = [];
for (let i = 0; i < count; i++) {
let uuid = (type === '1') ? uuidv1() : uuidv4();
if (isUppercase) {
uuid = uuid.toUpperCase();
}
uuids.push(uuid);
}
const resultText = uuids.join('\n');
const highlightedCode = hljs.highlightAuto(resultText, ['apache']).value;
resultDiv.innerHTML = `<pre><code class="hljs">${highlightedCode}</code><span class="hljs-ctc" onclick="ctcCode(this)">Copy</span></pre>`;
toast?.('UUID값이 생성되었습니다.', TOAST_INFORMATION, true);
}
Copy
실제로 출력되는 결과는 아래처럼 보이며 내 사이트에 적용한 하이라이터를 통해서 내용을 쉽게 보고 복사할 수 있게 구현했다.

최소 1개의 값에서 최대 10,000개의 값을 출력할 수 있게 만들어놓았으며 버튼을 통해 쉽게 1, 10, 100단위로 출력 개수를 설정할 수 있는 기능도 추가했다.
끝!
#JavaScript
0
개의 댓글
개발 카테고리의 다른 글
04/16
JSON 테스트 데이터
우리가 급하게 JSON 형식의 데이터가 필요할때 그걸 일일히 만들고있기에는 JSON 데이터구조가 나름 복잡한 구조라고 볼 수 있다.그렇기 때문에 보통 임의의 배열을 만들고 JSON 관련 인코딩/디코딩 함수를 통해 일련의 정보를 얻는 방식을 취한다. 하지만 정말 급하게 JSON 형태의 데이터가 필요할 경우 로렌입숨처럼 쉽게...
04/15
certbot renew 갱신 실패시 docker 작업 불능 문제 (dockert certbot)
아...진짜 오랜만에 그지같은걸 당했다.안당해보면 모를만한걸 당해서 좀 어이없기도하고 이제와서 당했다는게 부끄럽기도하다... 사건발단나는 회사에서 도커서버를 통해 여러 웹사이트의 라이브서비스를 제공하는 식의 서버를 운영하고있다.쉽게 말해 물리적 서버는 하나인데, 프록시 서버로 여러개의 도커컨테이너에 라...
04/14
MPEGTS 컨테이너 파일 MP4로 변환하는 법
개인적인 공간에서 PLEX로 영상을 관리하는데 일부기기에서 영상재생이 안된다는 내용을 받게되었다.무슨문제인가 싶어 해당 영상의 정보를 확인해 봤는데, 코덱이나 영상자체는 문제가 없었다. 단 영상의 Container가 처음보는 MPEGTS 값으로 되어있었다.이게 뭔가해서 알아보니 MPEGTS는 MPEG-TS(Transport Steam)으로 방...