// just a random number
const rnd = (p) => Math.floor(Math.random() * (p - 1)) + 1
// our secret, there are maximum `p*p` equivalent ways of representing any number by this obfuscation method
const p = 19
const start = 2048
// obfuscate i
const enc = i => {
const r = rnd(p)
return r * (i + start) * p + r
}
// deobfuscate e
const dec = e => {
const r = e % p
const ri = (e - r) / p
return (ri / r) - start
}
// test: must return an empty array `[]`
console.log(
[...new Array(100000).keys()].map(i =>
[i, enc(i)]
).filter(([i, e]) => dec(e) != i)
)
// some examples:
console.log(
[...new Array(30).keys()]
.concat(
[...new Array(100).keys()].map(i => rnd(10000)).sort((a, b) => a <= b ? -1 : 1)
)
.map(i =>
[i, enc(i)]
)
)
const veryLargeNumber = Math.pow(10,12) + rnd(Math.pow(10,13))
const encVeryLargeNumber = enc(veryLargeNumber)
console.log(veryLargeNumber, encVeryLargeNumber, dec(encVeryLargeNumber))