forgeid
Version:
Scalable and secure unique ID generator with HMAC verification and time-based growth.
1 lines • 2.63 kB
JavaScript
(()=>{var e={730:(e,t,r)=>{const s=r(857),o=r(982);e.exports=class{constructor(e="forgeid-secret",t=1970,r=10,s=10){this.secretKey=e,this.yearBegin=t,this.initialLength=r,this.growthInterval=s}hashFingerprint(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r);return t>>>0}getMachineSignature(){try{const e=s.hostname?.()||"",t=s.networkInterfaces();for(const r in t)for(const s of t[r])if(!s.internal&&s.mac&&"00:00:00:00:00:00"!==s.mac){const t=`${e}-${s.mac}`;return(this.hashFingerprint(t)%1048576).toString(36)}return(this.hashFingerprint(e)%1048576).toString(36)}catch{return Math.floor(1048576*Math.random()).toString(36)}}encodeBase62(e){return e.toString("base64").replace(/[^a-zA-Z0-9]/g,"")}getDynamicLength(){const e=(new Date).getFullYear()-this.yearBegin;return this.initialLength+Math.floor(e/this.growthInterval)}generate(e="",t=""){const r=this.getDynamicLength(),s=`${this.encodeBase62(o.randomBytes(12))}${this.getMachineSignature()}${Date.now().toString(36)}`.slice(0,r),n=s+o.createHmac("sha256",this.secretKey).update(s).digest("hex").slice(0,10).toLowerCase(),i=e?`${e}-${n}`:n;return this.format(i,t)}format(e,t=""){if(!e||"string"!=typeof e)return"";const[r,...s]=e.split("-"),o=(s.join("-")||r).replace(/[^a-zA-Z0-9]/g,"");let n="";if("dash"===t)n=o.replace(/(.{6})/g,"$1-").replace(/-$/,"");else{if("space"!==t)return e;n=o.replace(/(.{6})/g,"$1 ").trim()}return s.length>0?`${r}-${n}`:n}verify(e){if(!e||"string"!=typeof e)return!1;const t=e.split("-"),r=(t.length>1?t.slice(1).join(""):e).replace(/[^a-zA-Z0-9]/g,"");if(r.length<=10)return!1;const s=r.slice(-10).toLowerCase(),n=r.slice(0,-10);return s===o.createHmac("sha256",this.secretKey).update(n).digest("hex").slice(0,10).toLowerCase()}stressTest(e=1e6,t=1e5){const r=new Set,s=Date.now();let o=0,n=0;for(let i=1;i<=e;i++){const e=this.generate();if(r.has(e)?o++:r.add(e),this.verify(e)||n++,i%t===0){const e=((Date.now()-s)/1e3).toFixed(2),t=(process.memoryUsage().heapUsed/1024/1024).toFixed(2);console.log(`🧪 ${i.toLocaleString()} keys | Duplicates: ${o} | Invalid: ${n} | Time: ${e}s | RAM: ${t} MB`)}}const i=((Date.now()-s)/1e3).toFixed(2);console.log(`\n✅ Done: ${e.toLocaleString()} keys`),console.log(`⏱️ Total time: ${i}s`),console.log(`🧬 Unique: ${r.size.toLocaleString()}`),console.log(`⚠️ Duplicates: ${o}`),console.log(`❌ Invalid: ${n}`)}}},857:e=>{"use strict";e.exports=require("os")},982:e=>{"use strict";e.exports=require("crypto")}},t={};var r=function r(s){var o=t[s];if(void 0!==o)return o.exports;var n=t[s]={exports:{}};return e[s](n,n.exports,r),n.exports}(730);module.exports=r})();