Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jamesknelson/base28
Format sequential database ids as 6-character case-insensitive strings – ideal for URLs.
https://github.com/jamesknelson/base28
Last synced: 13 days ago
JSON representation
Format sequential database ids as 6-character case-insensitive strings – ideal for URLs.
- Host: GitHub
- URL: https://github.com/jamesknelson/base28
- Owner: jamesknelson
- License: mit
- Created: 2022-01-18T06:59:13.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2022-01-19T04:09:19.000Z (almost 3 years ago)
- Last Synced: 2024-08-10T21:22:26.296Z (3 months ago)
- Language: TypeScript
- Size: 80.1 KB
- Stars: 0
- Watchers: 3
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# base28
**Represent your integer database ids as 6-character base-28 strings – an ideal format for URLs.**
- Maximum supported input is 0x0fffffff, i.e. 268,435,455.
- Distributable size is 2.7kb, minified and gzipped.
- *Zero* runtime dependencies.## Base28 Alphabet
This package's base28 encoding comprises of 8 numbers and 20 characters:
```
BCDFGHJKMN
PQRSTVWXYZ
23456789or
bcdfghjkmn
pqrstvwxyz
23456789
```These numbers and letters have been picked according to the criteria:
- Encoded ids should typically look like ids - not words. This is achieved by omitting the vowels.
- It should easy to visually distinguish between all characters - which is why `1` and `0` have been omitted - which can be confused with 'I' and 'O'.
- It should be easy to communicate the characters through voice - thus lower and upper case characters can be used interchangeably.## Encoding
It's often undesireable for sequential ids to be readily [identified](https://en.wikipedia.org/wiki/German_tank_problem) as such. To avoid this, this encoding [obfuscates](https://stackoverflow.com/questions/8554286/obfuscating-an-id) your ids by applying a reversible pseudo-random looking mapping during encoding and decoding. For example:
```
0 -> GXBSXJ -> 0
1 -> PNPV8H -> 1
2 -> M3BXDH -> 2
3 -> TSP3GS -> 3
```While this won't prevent any dedicated attackers from iterating through your ids, it will at least provide some protection against casual voyeurs.
## Prior Art
- The obfuscation algorithm is inspired by the answers to [Stack Overflow question](https://stackoverflow.com/questions/8554286/obfuscating-an-id).
- The base28 encoder is based on [cbschuld/uuid-base58](https://github.com/cbschuld/uuid-base58).## Contributing
Pull requests would be appreciated for:
- If you want to work with inputs greater than 268,435,455, it should be possible to extend this to work with 7 or 8-character strings.
- Configuration of the obfuscator. In particular, it should be possible to pick configure the XOR and ROT numbers through a single large integer.
- Much of the size of this library is due to a bundled, pared-down version of Google's BigInt polyfill. Exporting a second distributable with native BigInt would be a great pull request.
## License
Copyright 2022, James K Nelson. Available for use under MIT License.