Как сделать уникальный короткий URL с Python?

Я следующее сообщение об ошибке при направлении эта та же проблема:

тип одного из выражений в пункте соединения является неправильным. Вывод типа перестал работать в вызове к 'GroupJoin'.

Решенный, когда я использовал то же имя свойства, оно работало.

(...)

join enderecoST in db.PessoaEnderecos on 
    new 
      {  
         CD_PESSOA          = nf.CD_PESSOA_ST, 
         CD_ENDERECO_PESSOA = nf.CD_ENDERECO_PESSOA_ST 
      } equals 
    new 
    { 
         enderecoST.CD_PESSOA, 
         enderecoST.CD_ENDERECO_PESSOA 
    } into eST

(...)

34
задан CloudyMarble 8 August 2011 в 04:12
поделиться

5 ответов

На самом деле не имеет значения, что это Python, но вам просто нужна хеш-функция, которая отображает желаемую длину. Например, можно использовать MD5, а затем взять только первые n символов. Однако в этом случае вам придется остерегаться столкновений, поэтому вы можете выбрать что-то более надежное с точки зрения обнаружения столкновений (например, использование простых чисел для циклического перемещения по пространству строк хеширования).

1
ответ дан 27 November 2019 в 16:50
поделиться

Изменить : Здесь я написал модуль для тебя. Используй это. http://code.activestate.com/recipes/576918/


Подсчет от 1 гарантирует короткие уникальные URL-адреса. / 1, / 2, / 3 ... и т. Д.

Добавление прописных и строчных букв к вашему алфавиту даст URL-адреса, подобные тем, что указаны в вашем вопросе. И вы просто считаете по основанию 62 вместо 10.

Теперь единственная проблема состоит в том, что URL-адреса приходят последовательно. Чтобы исправить это, прочтите мой ответ на этот вопрос здесь:

Карта увеличения целочисленного диапазона до шестизначной базы 26 макс, но непредсказуемо

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

23
ответ дан 27 November 2019 в 16:50
поделиться

Я не знаю, можете ли вы это использовать, но мы генерируем объекты содержимого в Zope, которые получают уникальные числовые идентификаторы на основе строк текущего времени в миллисекундах (например, 1254298969501)

Возможно остальное вы можете догадаться. Используя рецепт, описанный здесь: How to convert an integer to the shortest url-safe string in Python?, we encode and decode the real id on the fly, with no need for storage. A 13-digit integer is reduced to 7 alphanumeric chars in base 62, for example.

To complete the implementation, we registered a short (xxx.yy) domain name, that decodes and does a 301 redirect for "not found" URLs,

If I was starting over, I would subtract the "starting-over" time (in millis) from the numeric id prior to encoding, then re-add it when decoding. Or else when generating the objects. Whatever. That would be way shorter..

1
ответ дан 27 November 2019 в 16:50
поделиться

Я не уверен, что большинство сокращателей URL используют случайную строку. У меня сложилось впечатление, что они записывают URL-адрес в базу данных, а затем используют целочисленный идентификатор новой записи в качестве короткого URL-адреса с кодировкой 36 или 62 (буквы + цифры).

Код Python для преобразования int в строку в произвольной баз - , здесь .

17
ответ дан 27 November 2019 в 16:50
поделиться

Причина того, что UUID длинные, состоит в том, что они содержат много информации, поэтому их уникальность в глобальном масштабе может быть гарантирована.

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

Если вам нужна помощь в создании случайных строк в Python, это другой вопрос может помочь.

2
ответ дан 27 November 2019 в 16:50
поделиться
Другие вопросы по тегам:

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