swift_ids

Convert number IDs to human friendly string and back.

integerswift_id
0GX08
1HY9U
2JA2Q
5D9YU
1000SF7B
10000000GM1Y3Q

The generated ID is:

  • fast to convert back and forth (algorithm uses mostly binary operations)
  • seems random (end user can't browse trough entities easily)
  • user can't tell how many entities there are
  • shorter than original int (5 characters can save 8388608 ids)
  • easy to write down / spell over the phone because generated string uses:
    • only uppercase letters,
    • no confusing digits: O=0 and I=L=1
    • no two consecutive characters are the same
  • avoid accidental profanities (and words in general)
  • minimum length is configurable

usage

var encode = new Id(5);
print("${encode.value} == ${encode.toString()}"); //5 == D9YU
var decode = new Id.fromString('D9YU');
print("${decode.value} == ${decode.toString()}"); //4 == C84X

var encode2 = new Id(5, minLength:10, zero:0x55555555555);
print("${encode2.value} == ${encode2.toString()}"); //5 == HBQ8H7E85B
//same zero/minLength need to be used when decoding
var decode2 = new Id.fromString('HBQ8H7E85B', minLength:10, zero:0x55555555555);
print("${decode2.value} == ${decode2.toString()}"); //4 == C84X

zero is an initial value that is XORed with input that can be used to:

  • make separate entities ids not overlap (so user with id=5 won't have same hash as message with id=5)
  • mangle initial integer to prevent repetitions for small integers with large minLength
  • zero should have maximum (5 * minLength) - (2 * (minLength / 3)) bits.

Libraries

swift_ids