shortening
Version:
4 lines (3 loc) • 1.09 kB
JavaScript
// Copyright (c) 2019 Neil Vallon (https://neil.vallon.me)
// Licensed under MIT (https://opensource.org/licenses/MIT)
const shortening=function(){const t=4294967295;function n(n){const e=n.length;if(32!=e&&64!=e)throw"only base64 or base32 supported";const r=32==e?5:6,o=function(n){const e=[0];for(let r=1;;r++){const o=(e[r-1]+1)*n;if(t<o)break;e.push(o)}return e}(e),c=o[o.length-1],l=n.split(""),u=function(t){const n=new Array(256).fill(255);for(let e=0;e<t.length;e++)n[t.charCodeAt(e)]=e;return n}(n);return{_cs:n,_mt:o,Encode:function(n){if(!Number.isInteger(n)||n<0||t<n)return;let u=function(t){const n=Math.floor((32-Math.clz32(t))/r);return o[n]<=t?n+1:n}(n)-1;n-=c;let f="";for(;0<=u;u--)f+=l[n>>>r*u&e-1];return f},Decode:function(n){if(null==n)return-1;if(o.length<n.length||0==n.length)return-1;let r=0,c=0;for(let t=0;t<n.length;t++){const o=u[255&n.charCodeAt(t)];c|=o,r=r*e+o}return r+=o[n.length-1],255==c?-2:t<r?-3:r}}}return{MAX_INT:t,New:n,Std64:n("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"),Std32:n("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567")}}();