Cómo reemplazar la clave principal de Django con un número entero diferente que es único para esa tabla

Tengo una aplicación web de Django que utiliza los enteros positivos predeterminados con incremento automático como clave principal. Esta clave se utiliza en toda la aplicación y se inserta con frecuencia en la URL. No quiero exponer este número al público para que puedan adivinar el número de usuarios u otras entidades en mi Base de datos.

Este es un requisito frecuente y he visto preguntas similares a las mías con respuestas. La mayoría de las soluciones recomiendan cifrar el valor de la clave primaria original. Sin embargo, ninguna de esas respuestas se ajusta exactamente a mi necesidad. Estos son mis requisitos:

Me gustaría mantener el tipo de campo Clave primaria como Entero.También preferiría no tener que hacer hash / unhash este valor cada vez que se lee o se escribe o se compara con la base de datos. Parece un desperdicio Sería bueno hacerlo solo una vez: cuando el registro se inserta inicialmente en la Base de datosLa función de cifrado / hashing no necesita ser reversible ya que no necesito recuperar la clave secuencial original. El valor hash solo necesita ser único.El valor hash debe ser único SOLAMENTE para esa tabla, no universalmente único.El valor hash debe ser lo más corto posible. Me gustaría evitar URLs extremadamente largas (más de 20 caracteres)

¿Cuál es la mejor manera de lograr esto? ¿Funcionaría lo siguiente?

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)

Respuestas a la pregunta(4)

Su respuesta a la pregunta