django:如何从数据库对象的主键中散列URL?

时间:2012-05-11 23:55:52

标签: python django design-patterns url hash

我正在尝试为我的数据库对象生成URL。 I've read我不应该使用URL的主键,并且存根不是这个特定模型的好选择。根据该链接中的建议,我在Python解释器中使用zlib.crc32(),发现值通常会返回负数,而我的URL中不需要这些数字。我应该使用更好的哈希来生成我的URL吗?

UPDATE:我最终使用了David提出的按位XOR屏蔽方法,并且效果非常好。感谢大家的意见。

1 个答案:

答案 0 :(得分:11)

首先,“不要在URL中使用主键”只是一个非常弱的准则。 如果您正在使用增量整数ID ,您不想透露这些数字,那么您可以对它们进行一些混淆。例如,您可以使用:masked_id = entity.id ^ 0xABCDEFABunmasked_id = masked_id ^ 0xABCDEFAB

其次,您链接的文章高度可疑。我不相信。首先,CRC32是一种单向散列函数:通常不可能(通常)采用CRC32散列并返回用于创建该散列的字符串。你会注意到他没有告诉你如何在给定Customer的CRC32的情况下查找pk。其次,文章中的代码甚至没有意义。 zlib.crc32函数需要一个字节字符串,而Customer.id则是一个整数。

第三,如果你想为一个URL使用一个slug,要小心:如果slug改变了,你的URL也会改变。这可能没问题,但这是你需要考虑的事情。