Created
April 18, 2018 08:09
-
-
Save ekoneko/734a10cc855ea22643ba653aedff52ca to your computer and use it in GitHub Desktop.
Semver to Number
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const defaultBitLength = 6 | |
const maxBitLength = 16 | |
function transformSemver2Number (semver: string): string { | |
const [n1, n2, n3] = semver.split('.').map(Number) | |
const maxNum = Math.max(n1, n2, n3) | |
const minBitLength = Math.ceil(Math.log2(maxNum)) | |
const bitLength = Math.max(minBitLength, defaultBitLength) | |
if (bitLength > maxBitLength) { | |
throw new Error('semver too big!') | |
} | |
const numberVersion = (n1 << bitLength * 2) + (n2 << bitLength) + n3 | |
return (bitLength - defaultBitLength + 1).toString() + numberVersion | |
} | |
function transformNumber2Semver (numString: string) { | |
const bitLength = +numString[0] + defaultBitLength - 1 | |
const numberVersion = +numString.slice(1) | |
const n3 = numberVersion & (1 << bitLength) - 1 | |
const n2 = numberVersion >> bitLength & (1 << bitLength) - 1 | |
const n1 = numberVersion >> bitLength * 2 & (1 << bitLength) - 1 | |
return `${n1}.${n2}.${n3}` | |
} | |
console.log(transformSemver2Number('1.1.1')) // 14161 | |
console.log(transformSemver2Number('1.2.3')) // 14227 | |
console.log(transformSemver2Number('1.4.3')) // 14355 | |
console.log(transformSemver2Number('2.0.0')) // 18192 | |
console.log(transformSemver2Number('4.3.1')) // 116577 | |
console.log(transformSemver2Number('255.255.255')) // 316777215 | |
console.log(transformSemver2Number('1.999.3')) // 32071555 | |
console.log(transformNumber2Semver('14227')) // 1.2.3 | |
console.log(transformNumber2Semver('316777215')) // 999.999.999 | |
console.log(transformNumber2Semver('52071555')) // 1.999.3 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment