Есть встроенный в Django способ достичь того, чего вы хотите. Добавьте поле к модели «пользовательской страницы» с именем primary_key=True
и default=
функции генерации ключа, например:
class CustomPage(models.Model):
...
mykey = models.CharField(max_length=6, primary_key=True, default=pkgen)
...
Теперь для каждого экземпляра модели page
, page.pk
становится псевдонимом для page.mykey
, который автоматически присваивается строке, возвращаемой вашей функцией pkgen()
в момент создания этого экземпляра.
Быстрая и грязная реализация:
def pkgen():
from base64 import b32encode
from hashlib import sha1
from random import random
rude = ('lol',)
bad_pk = True
while bad_pk:
pk = b32encode(sha1(str(random())).digest()).lower()[:6]
bad_pk = False
for rw in rude:
if pk.find(rw) >= 0: bad_pk = True
return pk
Вероятность того, что две страницы получат идентичные первичные ключи, очень мала (при условии, что random()
является достаточно случайной), и нет проблем параллелизма. И, конечно же, этот метод легко расширяем, выделяя больше символов из кодированной строки.
Полностью согласен. Наконец-то появился естественный способ обработки объектов, размещенных в куче.
В ответ на:
Я не уверен, но похоже, что это позволяет перемещать группы
unique_ptr
с помощьюmemmove ()
как операции,
было предложение разрешить это, но оно не вошло в Стандарт C ++ 11.
Да, вы правы. Я бы только добавил, что это возможно благодаря ссылкам на r-значение.
Этот вопрос иллюстрирует, почему мне так нравится сборщик мусора Boehm (libgc). Нет необходимости что-либо копировать по причинам управления памятью, и действительно, владение памятью больше не нужно упоминать как часть API. Вы должны купить немного больше оперативной памяти, чтобы получить такую же производительность процессора, но вы сэкономите сотни часов времени программистов. Вам решать.
Похоже, что три условия, которые я перечислил в своем сообщении, можно получить, используя Библиотеку контейнеров указателя ускорения .