сокращение c# представляет в виде строки для URL

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

каково было бы лучшее решение?

сайт будет мобильным сайтом, таким образом, я захочу к нему к максимально короткому

6
задан chollida 13 January 2010 в 20:55
поделиться

5 ответов

Вы не можете «однозначно сократить» произвольные струны. Принцип голубоготся и все.

То, что вы хотите сделать (и, AFAIK, какие услуги URL-укороченные URL делают) - держать базу данных, представленную всем, и короткая строка используется. Тогда вы можете посмотреть это в базе данных.

Вы можете генерировать короткие строки, просто увеличивая число и Base64, кодирующее его каждый раз.

6
ответ дан 10 December 2019 в 02:48
поделиться

Храните случайную альфа-числовую строку и используйте ее для вашего короткого URL. Сделайте это длиной, которую вы думаете, лучше всего для вашего сайта, и это пользователи каким-то вроде www.yoursite.com/d8f3

0
ответ дан 10 December 2019 в 02:48
поделиться

Можно использовать хэш (например, CRC32) для создания довольно коротких URL. Вы никогда не сможете получить "уникальные" URL, так как вы уменьшаете данные, поэтому должны быть столкновения.

0
ответ дан 10 December 2019 в 02:48
поделиться

Промежуточное программное обеспечение является предпочтительным способом выполнения подобных действий на основе «каждого запроса». Например, вот простой бит промежуточного программного обеспечения, чтобы добавить тот же самый (пример) заголовок P3P к каждому ответу Джанго генерирует:

В settings.py:

P3P_COMPACT = 'policyref="http://www.example.com/p3p.xml", CP="NON DSP COR CURa TIA"'
MIDDLEWARE_CLASSES += ('myapp.middleware.P3PHeaderMiddleware',)

В myapp/middleware.py:

from django.conf import settings

class P3PHeaderMiddleware(object):
    def process_response(self, request, response):
        response['P3P'] = getattr(settings, 'P3P_COMPACT', None)
        return response

Вы также можете получить аналогичный эффект в одном представлении, установив заголовок P3P в ответе:

def my_view(request):
    response = render_to_response('my_template.html')
    response['P3P'] = 'CP="NON DSP COR CURa TIA"'
    return response

Чтобы немного расширить тему, cookie и заголовки, такие как заголовок P3P, отправляются одновременно, как часть ответа; фактически, под колпаком печенье устанавливается с другим заголовком ответа. Заголовок файла cookie можно просмотреть с помощью завитка:

$ curl --head http://www.google.com/
HTTP/1.1 200 OK
Date: Wed, 13 Jan 2010 00:04:59 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: PREF=ID=d2c09762c479f94e:TM=1263341099:LM=1263341099:S=oJby3NpU4RsRfuYa; expires=Fri, 13-Jan-2012 00:04:59 GMT; path=/; domain=.google.com
Set-Cookie: NID=30=kdKrd5e-u6Xs7cUe3p4eaNDtv6SO88uBL5v6_M1XMTSRmkh7okxrWLOm-l_uZdN37PxQIe4dBlekFFVCpTFXGyIDlUrz1hEwhgVLvXfIik_VeVWGmWzKbA5qu_Zq0sOi; expires=Thu, 15-Jul-2010 00:04:59 GMT; path=/; domain=.google.com; HttpOnly
Server: gws
X-XSS-Protection: 0
Transfer-Encoding: chunked
-121--2477039-

$ _ SERVER [«REMOTE _ ADDR»] . Хотя это поддельно испражнению.

Проверьте этот вопрос для очень подробного обсуждения.

Я думаю, что то, что вы помните с PHPMyAdmin, это что-то другое: многие серверы MySQL настроены так, что они могут быть доступны только с localhost по соображениям безопасности.

-121--794582-

Эй, как вам сказали несколько других людей.. Если вы начнете сжимать URL-адрес в что-то небольшое, вы не сможете сохранить его уникальным. Тем не менее, вы должны сделать свой собственный код для каждого URL, отправленного вам. Один из способов (легко) сделать это, попытаться создать базу данных из переданных URLS, а затем создать GUID поле для каждого, а затем получить подстроку из него, чтобы каждый раз, когда вы регистрируете что-то полностью отличается от предыдущего.

Например: www.google.com с guid F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4 - > http://www.mysite.com/?q=CEB2

По мере использования большее количество ссылок можно продолжать трек. для этого образца у вас будет 65536 различных ссылок (всего 4 символа в шестнадцатеричном формате).

Надеюсь, это поможет.

-2
ответ дан 10 December 2019 в 02:48
поделиться

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

  1. Клиенты отправляют глобально уникальные идентификаторы, или
  2. Сервер генерирует глобально уникальные идентификаторы

Клиенты отправляют глобально уникальные идентификаторы

Насколько мне известно, 1. следует предпринимать попытки только с Guid s , если вы не изобрели аналогичные средства для втискивания достаточно четкой информации в короткий поток байтов. В любом случае, если у вас есть поток байтов, представляющий глобальный уникальный идентификатор, вы можете сделать что-то вроде этого

// source is either a Guid, or some other globally unique byte stream
byte[] bytes = Guid.NewGuid ().ToByteArray ();
string base64String = Convert.ToBase64String (bytes).Trim ("=");

, чтобы получить читаемую пользователем строку буквенно-цифровых символов, которая выглядит случайной, но позволяет избежать коллизий, присущих другим случайным схемам. Guid содержит 16 байтов или 128 битов, что соответствует примерно 19 символам для полной кодировки Base64.

Преимущество этого подхода состоит в том, что клиенты могут создавать свои собственные крошечные Uris без центральной власти.Обратной стороной является большая длина, если вы используете Guid или реализуете свой собственный глобально уникальный поток байтов, который, давайте посмотрим правде в глаза, подвержен ошибкам.

Если вы действительно пойдете по этому пути, подумайте о том, чтобы Google использовал глобально уникальные потоки байтов или что-то подобное. О, и НЕ ДОПУСКАЙТЕСЬ ОТ СЛУЧАЙНЫХ БАЙТОВ , в противном случае вам придется создавать разрешение коллизий НАЗАД вашего крошечного генератора Uri.

Сервер генерирует глобально уникальные идентификаторы

Опять же, основное преимущество вышеизложенного состоит в том, что клиент может генерировать свои Uris априори . Это особенно удобно, если вы собираетесь отправить длительный запрос, который хотите проверить. Это может не иметь особого отношения к вашей ситуации и иметь ограниченную ценность.

Таким образом, в стороне, ориентированный на сервер подход, в котором единый орган власти генерирует и распределяет идентификаторы, может быть более привлекательным. Если это выбранный вами маршрут, то единственный вопрос: какой длины вы хотите использовать свой Uri?

Предполагая желаемую длину в 5 символов и допустим, вы используете кодировку Base64, каждый идентификатор может представлять до 5 символов. на 7 бит на символ равняется 35 битам или 2 ^ 35 [34 359 738 368] различных значений. Это довольно большой домен. *

Затем возникает вопрос о возврате значения для данного представления.Вероятно, существует множество способов сделать это, но я бы выбрал что-то вроде этого:

  • Перечислить все возможные значения в «свободном списке» в вашей базе данных
  • Удалить значение из свободного списка при использовании
  • Добавить значение в свободный список при выпуске

Улучшения или оптимизации могут включать

  • Не перечислять каждое значение в диапазоне [0, 2 ^ 35], вместо этого перечислять управляемое подмножество, скажем, 100 000 значений за раз, и когда все значения потребляются, просто сгенерируйте последовательно еще 100 000 значений и продолжите.
  • Добавьте дату истечения срока действия к значениям и повторно используйте просроченные значения в конце дня
  • Распределите вашу службу, когда распараллеливание вашей службы просто выделите небольшие взаимоисключающие подмножества ваш бесплатный список распределенных сервисов

Заключение

Суть в том, что вы хотите гарантировать уникальность - поэтому коллизии недопустимы.


* = 34 359 738 368 - это размер необработанного домена, это все идентификаторы от 0 до 5 длины. Если вы заинтересованы в ограничении всех идентификаторов минимальной и максимальной длиной 5, тогда ваш домен выглядит так, как будто все идентификаторы длины от 0 до 5 (2 ^ 35) минус все идентификаторы длины от 0 до 4 (2 ^ 28) равны 2 ^ 35 - 2 ^ 28 = 34 091 302 912, что все еще довольно велико :)

5
ответ дан 10 December 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: