Wie man Djangos Primärschlüssel durch eine andere Ganzzahl ersetzt, die für diese Tabelle eindeutig ist

Ich habe eine Django-Webanwendung, die die standardmäßig automatisch inkrementierten positiven Ganzzahlen als Primärschlüssel verwendet. Dieser Schlüssel wird in der gesamten Anwendung verwendet und häufig in die URL eingefügt. Ich möchte diese Nummer nicht der Öffentlichkeit zugänglich machen, damit sie die Anzahl der Benutzer oder anderer Entitäten in meiner Datenbank erraten kann.

Das ist eine häufige Anforderung und ich habe Fragen zu ähnlichen meinen mit Antworten gesehen. Die meisten Lösungen empfehlen das Hashing des ursprünglichen Primärschlüsselwerts. Keine dieser Antworten entspricht jedoch genau meinen Anforderungen. Das sind meine Anforderungen:

Ich möchte den Feldtyp des Primärschlüssels als Ganzzahl beibehalten.Ich würde es auch vorziehen, diesen Wert nicht bei jedem Lesen, Schreiben oder Vergleichen mit der Datenbank zu hacken oder zu enthacken. Das scheint verschwenderisch. Es wäre schön, es nur einmal zu tun: Wenn der Datensatz zum ersten Mal in die Datenbank eingefügt wird.Die Hashing- / Verschlüsselungsfunktion muss nicht umkehrbar sein, da ich den ursprünglichen sequentiellen Schlüssel nicht wiederherstellen muss. Der Hash-Wert muss nur eindeutig sein.Der Hash-Wert muss NUR für diese Tabelle eindeutig sein - nicht universell eindeutig.Der Hash-Wert sollte so kurz wie möglich sein. Ich möchte extrem lange URLs (über 20 Zeichen) vermeiden.

Was ist der beste Weg, um dies zu erreichen? Würde das folgende funktionieren?

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)