Биективная функция "Integer <-> String"

Вот проблема, для которой я пытаюсь найти оптимальное решение. У меня есть конечное множество неотрицательных целых чисел в диапазоне [0...N]. Мне нужно иметь возможность представить каждое число в этом наборе в виде строки и иметь возможность преобразовать такую строку обратно в исходное число. Таким образом, это должна быть биективная функция.

Дополнительные требования:

  1. Строковое представление числа должно скрывать исходное число хотя бы в некоторой степени. Поэтому примитивное решение типа f(x) = x.toString() не будет работать.
  2. Длина строки важна: чем меньше, тем лучше.
  3. Если известно строковое представление K, то хотелось бы, чтобы нетривиально (в какой-то степени) было угадать строковое представление K+1.

Для п.1 и п.2 очевидным решением является использование чего-то вроде нотации Base64 (или любой другой BaseXXX, чтобы вместить все значения). Но можем ли мы уложиться в п.3 с минимальными дополнительными усилиями? Здравый смысл подсказывает мне, что дополнительно нужна биективная функция "String <-> String" для значений BaseXXX. Есть предложения? Или, может быть, есть что-то лучше, чем BaseXXX, что можно использовать, чтобы соответствовать всем 3 требованиям?

5
задан andrew.z 12 January 2012 в 09:55
поделиться