Следуя примеру 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. Если вам интересно, рассмотрите возможность присоединиться к нам в апреле !