Я следующее сообщение об ошибке при направлении эта та же проблема:
тип одного из выражений в пункте соединения является неправильным. Вывод типа перестал работать в вызове к '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
(...)
На самом деле не имеет значения, что это Python, но вам просто нужна хеш-функция, которая отображает желаемую длину. Например, можно использовать MD5, а затем взять только первые n
символов. Однако в этом случае вам придется остерегаться столкновений, поэтому вы можете выбрать что-то более надежное с точки зрения обнаружения столкновений (например, использование простых чисел для циклического перемещения по пространству строк хеширования).
Изменить : Здесь я написал модуль для тебя. Используй это. http://code.activestate.com/recipes/576918/
Подсчет от 1 гарантирует короткие уникальные URL-адреса. / 1, / 2, / 3 ... и т. Д.
Добавление прописных и строчных букв к вашему алфавиту даст URL-адреса, подобные тем, что указаны в вашем вопросе. И вы просто считаете по основанию 62 вместо 10.
Теперь единственная проблема состоит в том, что URL-адреса приходят последовательно. Чтобы исправить это, прочтите мой ответ на этот вопрос здесь:
Карта увеличения целочисленного диапазона до шестизначной базы 26 макс, но непредсказуемо
В основном подход состоит в том, чтобы просто поменять местами биты в увеличивающемся значении, чтобы создать видимость случайность, сохраняя при этом детерминизм и гарантируя отсутствие конфликтов.
Я не знаю, можете ли вы это использовать, но мы генерируем объекты содержимого в 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..
Я не уверен, что большинство сокращателей URL используют случайную строку. У меня сложилось впечатление, что они записывают URL-адрес в базу данных, а затем используют целочисленный идентификатор новой записи в качестве короткого URL-адреса с кодировкой 36 или 62 (буквы + цифры).
Код Python для преобразования int в строку в произвольной баз - , здесь .
Причина того, что UUID длинные, состоит в том, что они содержат много информации, поэтому их уникальность в глобальном масштабе может быть гарантирована.
Если вам нужно что-то более короткое, вам нужно что-то сделать например, генерировать случайную строку, проверяя, находится ли она во вселенной уже сгенерированных строк, и повторять, пока не получите неиспользованную строку. Вам также необходимо следить за параллелизмом здесь (что, если одна и та же строка будет сгенерирована отдельным процессом до того, как вы вставите ее в набор строк?).
Если вам нужна помощь в создании случайных строк в Python, это другой вопрос может помочь.