Zum Hauptinhalt springen
claw
am
tools
Werkzeuge
Dokumente
Daoark
EN
Startseite
Startseite
/
Datenkonvertierung
›
Startseite
manifest.json
= 0; i--) { tsChars = ULID_ALPHA[t % 32] + tsChars; t = Math.floor(t / 32); } var randBytes = randomBytes(16); var randChars = ''; for (var j = 0; j < 16; j++) { randChars += ULID_ALPHA[randBytes[j] % 32]; } return tsChars + randChars; } // ObjectId (MongoDB): 24 hex,前 8 hex = unix 秒时间戳 function objectId() { var ts = Math.floor(Date.now() / 1000); var tsHex = ts.toString(16).padStart(8, '0'); var rand = bytesToHex(randomBytes(8)); return (tsHex + rand + bytesToHex(randomBytes(4))).substring(0, 24); } // 短 ID: 8 字符 Base62 var BASE62 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; function shortId() { var b = randomBytes(8); var n = 0n; for (var i = 0; i < 8; i++) n = (n << 8n) | BigInt(b[i]); var out = ''; while (n > 0n) { out = BASE62[Number(n % 62n)] + out; n = n / 62n; } return (out || '0').padStart(8, '0').substring(0, 8); } // 解析 UUID function parseUuid(s) { var cleaned = s.trim().replace(/-/g, ''); if (cleaned.length !== 32) return null; if (!/^[0-9a-fA-F]{32}$/.test(cleaned)) return null; var bytes = []; for (var i = 0; i < 32; i += 2) { bytes.push(parseInt(cleaned.substring(i, i+2), 16)); } var version = (bytes[6] >> 4) & 0x0f; var variant = (bytes[8] >> 6) & 0x03; // 0=0xx 1=10x 2=110 3=111 var variantStr = variant === 0 ? 'NCS' : variant === 1 ? 'RFC 4122' : variant === 2 ? 'Microsoft' : 'Future'; var ts = null; if (version === 1) { // UUID v1: 60 bit timestamp,前 4 字节 little-endian 时间低位 + 2 字节时间中位(后 2 字节 time_high) var tl = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24); var tm = bytes[4] | (bytes[5] << 8); var th = (bytes[6] & 0x0f); var ticks = th * 2**48 + tm * 2**32 + tl; // UUID time = ticks - 0x01b21dd213814000 (UUID epoch 1582-10-15) var ms = (ticks - 0x01b21dd213814000) / 10000; ts = new Date(ms).toISOString(); } else if (version === 7) { var ms7 = (bytes[0] << 40) | (bytes[1] << 32) | (bytes[2] << 24) | (bytes[3] << 16) | (bytes[4] << 8) | bytes[5]; ts = new Date(ms7).toISOString(); } else if (version === 4) { ts = 'N/A (v4 随机)'; } return { version: version, variant: variantStr, timestamp: ts, hex: cleaned }; } function escHtml(s) { return String(s).replace(/&/g, '&').replace(//g, '>'); } function doProcess() { try { var op = getVal('op'); if (op === 'gen') { var type = getVal('id-type'); var count = getInt('count', 5); if (count < 1 || count > 100) { showError('数量必须在 1-100 之间'); return; } var results = []; if (type === 'uuid-v4') { for (var i = 0; i < count; i++) results.push(uuidV4()); } else if (type === 'uuid-v7') { for (var j = 0; j < count; j++) results.push(uuidV7()); } else if (type === 'nanoid') { var nlen = getInt('nanoid-len', 21); if (nlen < 1 || nlen > 64) nlen = 21; for (var k = 0; k < count; k++) results.push(nanoId(nlen)); } else if (type === 'ulid') { for (var l = 0; l < count; l++) results.push(ulid()); } else if (type === 'objectid') { for (var m = 0; m < count; m++) results.push(objectId()); } else if (type === 'shortid') { for (var n = 0; n < count; n++) results.push(shortId()); } else { showError('未知 ID 类型: ' + type); return; } var typeNames = { 'uuid-v4': 'UUID v4 (36 字符)', 'uuid-v7': 'UUID v7 (36 字符,时间排序)', 'nanoid': 'NanoID (' + getInt('nanoid-len', 21) + ' 字符)', 'ulid': 'ULID (26 字符)', 'objectid': 'ObjectId (24 字符)', 'shortid': '短 ID (8 字符 Base62)' }; var html = '
'; for (var p = 0; p < results.length; p++) html += '
' + escHtml(results[p]) + '
'; html += '
'; showResult(html, typeNames[type] + ' × ' + count + ' (基于 crypto.getRandomValues)'); } else if (op === 'parse') { var s = getVal('text-a'); if (!s) { showError('请输入 UUID'); return; } var info = parseUuid(s); if (!info) { showError('UUID 格式错误,需要 8-4-4-4-12 共 32 个 hex 字符'); return; } var html2 = '
' + '
完整
' + escHtml(s.trim()) + '
' + '
无连字符
' + escHtml(info.hex) + '
' + '
Version
' + info.version + '
' + '
Variant
' + escHtml(info.variant) + '
' + '
时间戳
' + escHtml(info.timestamp || 'N/A') + '
' + '
'; showResult(html2, 'UUID 解析 (Version ' + info.version + ', ' + escHtml(info.variant) + ')'); } else { showError('未知操作'); } } catch (e) { showError('处理失败: ' + (e.message || e)); } } function syncFields() { var op = getVal('op'); var type = getVal('id-type'); var ngrp = $('nanoid-len-group'); var pgrp = $('parse-input-group'); if (op === 'parse') { pgrp.hidden = false; pgrp.style.display = 'block'; } else { pgrp.hidden = true; pgrp.style.display = 'none'; } if (op === 'gen' && type === 'nanoid') { ngrp.hidden = false; ngrp.style.display = 'block'; } else { ngrp.hidden = true; ngrp.style.display = 'none'; } } $('op').addEventListener('change', syncFields); $('id-type').addEventListener('change', syncFields); syncFields(); $('btn-main').addEventListener('click', function(e) { e.preventDefault(); doProcess(); }); $('btn-clear').addEventListener('click', function() { var inputs = document.querySelectorAll('input,textarea,select'); for (var i = 0; i < inputs.length; i++) { if (inputs[i].tagName === 'SELECT') inputs[i].selectedIndex = 0; else if (inputs[i].type === 'number') inputs[i].value = inputs[i].defaultValue; else inputs[i].value = ''; } var ra = $('result-area'); ra.hidden = true; ra.style.display = 'none'; var em = $('error-msg'); em.hidden = true; em.style.display = 'none'; syncFields(); }); })();