Каков наилучший способ сократить / преобразовать строку - PullRequest
0 голосов
/ 18 апреля 2011

У меня есть несколько пользователей, и я хотел бы создать реферальный URL для каждого из них, но я не думаю, что было бы неплохо иметь что-то вроде

http://domain.com/myusername

Я бы предпочел купить себясократить домен и преобразовать это myusername во что-то меньшее, , но не сгенерированное с использованием базы данных , чтобы им было легко управлять, и для этого не нужно иметь специальную таблицу.

своего родакак в Dropbox, так как мой реферал таков: http://db.tt/jnYosez

Есть ли простой способ перехода между строкой в ​​короткую строку и наоборот ... или я всегда могу использовать идентификатор пользователя, если язаставить использовать числовое ... может быть преобразование в другую базу чисел?

Любая идея в основном ценится:)

Ответы [ 2 ]

0 голосов
/ 18 апреля 2011

Вы не можете сделать это на месте без использования базы данных.Это потому, что имена короткие и, следовательно, вероятно, что имя использовалось раньше.

Вам необходимо сгенерировать имя (используя случайность или алгоритм), проверить, существует ли оно, и затем сохранить его в БД.

Обновление

Вот решение:

    public class NumberConverter
    {
        public const string HEX = "0123456789abcdef";
        public const string Bigger = "0123456789abcdefghihjklmnopqrstuvqyz";
        private int _numericBase;
        private string _base;

        public NumberConverter(string numberBase)
        {
            _base = numberBase;
            _numericBase = numberBase.Length;
        }

        public string ToString(int number)
        {
            var remainder = number % _numericBase;
            var div = number / _numericBase;
            string tmp = "";
            while (div > 0)
            {
                tmp = _base[remainder] + tmp;

                remainder = div % _numericBase;
                div = div / _numericBase;
            }
            tmp = _base[remainder] + tmp;

            return tmp;
        }

        public int ToNumber(string numberString)
        {
            int index = numberString.Length - 1;
            int value = 0;
            int power = 0;
            while (index >= 0)
            {
                char currentChar = numberString[index];
                var currentValue = _base.IndexOf(currentChar);
                value += currentValue * (int)Math.Pow(_numericBase, power);
                power++;
                --index;
            }

            return value;
        }
    }



    public static void Main()
    {
        var converter = new NumberConverter(NumberConverter.Bigger);
        int userId = 755757;
        var numberString = converter.ToString(userId); // prints g759
        var value = converter.ToNumber(numberString);
    }

Вы можете сократить число еще больше, добавив больше разрешенных в Uris.

Theresвероятно, более эффективный способ сделать это.Побитовые операции на самом деле не моя область.

Обновление 2

Символы, которые разрешены в URI, но не имеют зарезервированной цели, называются незарезервированными.К ним относятся заглавные и строчные буквы, десятичные цифры, дефис, точка, подчеркивание и тильда.

  unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"

Это означает, что вы можете использовать их для сокращения URL (если только ваш веб-сервер их не используетдля чего-то другого)

0 голосов
/ 18 апреля 2011

Возможно, вы захотите просмотреть bit.ly ссылки, они предоставляют API .

...