我正在尝试为我的数据库对象生成URL。 I've read我不应该使用URL的主键,并且存根不是这个特定模型的好选择。根据该链接中的建议,我在Python解释器中使用zlib.crc32(),发现值通常会返回负数,而我的URL中不需要这些数字。我应该使用更好的哈希来生成我的URL吗?
UPDATE:我最终使用了David提出的按位XOR屏蔽方法,并且效果非常好。感谢大家的意见。
答案 0 :(得分:11)
首先,“不要在URL中使用主键”只是一个非常弱的准则。 如果您正在使用增量整数ID 和,您不想透露这些数字,那么您可以对它们进行一些混淆。例如,您可以使用:masked_id = entity.id ^ 0xABCDEFAB
和unmasked_id = masked_id ^ 0xABCDEFAB
。
其次,您链接的文章高度可疑。我不相信。首先,CRC32是一种单向散列函数:通常不可能(通常)采用CRC32散列并返回用于创建该散列的字符串。你会注意到他没有告诉你如何在给定Customer
的CRC32的情况下查找pk
。其次,文章中的代码甚至没有意义。 zlib.crc32
函数需要一个字节字符串,而Customer.id
则是一个整数。
第三,如果你想为一个URL使用一个slug,要小心:如果slug改变了,你的URL也会改变。这可能没问题,但这是你需要考虑的事情。