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

У меня есть веб-приложение Django, которое использует автоинкрементные положительные целые числа по умолчанию в качестве первичного ключа. Этот ключ используется во всем приложении и часто вставляется в URL. Я не хочу показывать этот номер общественности, чтобы они могли угадать количество пользователей или других объектов в моей базе данных.

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

Я хотел бы сохранить тип поля первичного ключа как целое число.Я также предпочел бы не хэшировать / не хэшировать это значение каждый раз, когда оно читается или записывается или сравнивается с базой данных. Это кажется бесполезным. Было бы неплохо сделать это только один раз: когда запись изначально вставлена ​​в базу данных.Функция хеширования / шифрования не должна быть обратимой, поскольку мне не нужно восстанавливать исходный последовательный ключ. Хэшированное значение просто должно быть уникальным.Хэшированное значение должно быть уникальным ТОЛЬКО для этой таблицы, а не универсально уникальным.Хэшированное значение должно быть как можно короче. Я хотел бы избежать очень длинных (более 20 символов) URL

Каков наилучший способ добиться этого? Будет ли следующая работа?

def hash_function(int):
    return fancy-hash-function # What function should I use??


def obfuscate_pk(sender, instance, created, **kwargs):
    if created:
        logger.info("MyClass #%s, created with created=%s: %s" % (instance.pk, created, instance))
        instance.pk = hash_function(instance.pk)
        instance.save()
        logger.info("\tNew Pk=%s" % instance.pk)

class MyClass(models.Model):
    blahblah = models.CharField(max_length=50, null=False, blank=False,)


post_save.connect(obfuscate_pk, sender=MyClass)

Ответы на вопрос(4)

Ваш ответ на вопрос