Следуя примеру bit.ly, tinyurl, к тому же, даже
кока-кола присоединилась к короткому URL-адресу. Может быть, это из-за Twitter, может быть, мир сосредоточен на мобильных устройствах или просто экономит пропускную способность. В любом случае, это не так сложно, чтобы разработать свой собственный.
Реализация довольно проста: сохраните базовый URL в базе данных и верните ваш первичный ключ. Этот первичный ключ при отображении в виде числа (Base10) длиннее строго необходимого; поскольку каждый символ может содержать больше цифр, вы тратите пространство, ограничивая себя десятичным [0-9] диапазоном.
Введите Base58
Base58 — это то, что вы получаете после взятия Base62 [a-zA-Z0-9] и удаления любого символа, который может привести к ошибке при вводе вручную: 0 (ноль), O (верхний регистр ‘o’), I (верхний регистр ‘i’ ) и l (строчная буква «L»). Эта концепция была представлена широкой публике Flickr, которая использует следующую строку:
123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ
Для меня более логично использовать естественный порядок в диаграмме ASCII:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
Я опубликую здесь пример из последних. Для реализации Flickr вы можете перейти
 сюда .
public class StringUtils {
 private static final char[] BASE58_CHARS = 
     "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz".toCharArray();
 public static String numberToAlpha(long number) {
  char[] buffer = new char[20];
  int index = 0;
  do {
   buffer[index++] = BASE58_CHARS[(int) (number % BASE58_CHARS.length)];
   number = number / BASE58_CHARS.length;
  } while (number > 0);
  return new String(buffer, 0, index);
 }
 
 public static long alphaToNumber(String text) {
  char[] chars = text.toCharArray();
  long result = 0;
  long multiplier = 1;
  for (int index = 0; index < chars.length; index++) {
   char c = chars[index];
   int digit;
   if (c >= '1' && c <= '9') {
    digit = c - '1'; 
   } else if (c >= 'A' && c < 'I') {
    digit = (c - 'A') + 9;
   } else if (c > 'I' && c < 'O') {
    digit = (c - 'J') + 17;
   } else if (c > 'O' && c <= 'Z') {
    digit = (c - 'P') + 22;
   } else if (c >= 'a' && c < 'l') {
    digit = (c - 'a') + 33;
   } else if (c > 'l' && c <= 'z') {
    digit = (c - 'l') + 43;
   } else {
    throw new IllegalArgumentException("Illegal character found: '" + c + "'");
   }
    
   result += digit * multiplier;
   multiplier = multiplier * BASE58_CHARS.length;
  }
  return result;
 }
}
Пример ожидаемого размера вывода:
44 = m
1431117682956369 = abc123ABC
// Long.MAX_VALUE
9223372036854775807 = CFq8pKn6mQN
Это вряд ли ракетостроение. Вы можете найти библиотеки для этого для
 ruby ,
 javascript ,
 PHP или даже
 perl .
Это Base58 везде
Как только вы начинаете это делать, это не что иное, как привыкание. Вы можете настроить веб-каркас на использование конвертера Base58 для ключевых атрибутов в ваших URL-адресах и начать использовать «/ shows / cr5W» вместо «/ shows / 234324323423».
Все делают это прямо сейчас:
 Flickr ,
 Facebook или YouTube (который, кажется, использует [0-9a-zA-Z_-]).
Новости — Новости — Новости
В эти дни жизнь становится интересной с каждой минутой. На прошлой неделе наш любимый проект SimpleDS упоминался в блоге Google AppEngine , а в апреле следующего года мы проводим мастер-курс Javaspecialist в Мадриде!
Это будет потрясающе. Это самый продвинутый курс по Java, который я могу упомянуть, и после некоторых разговоров с доктором Кабуцем он согласился принести его в Мадрид. Он состоит из четырех дней интенсивной настройки производительности, отладки параллелизма, самоанализа, профилирования памяти и некоторых интересных головоломок Java. Если вам интересно, рассмотрите возможность присоединиться к нам в апреле !