Quick actions

cmd+k|ctrl+k

Navigation

Languages

Simple Stupid Number Obfuscation

Snippet info

Language

JavaScript

Visibility

public

Author

homam

Created

2019-03-03T15:24:03Z

Updated

2019-03-10T17:16:03Z

// 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))
INFO