我正在尝试为我的数据库对象生成 URL。我读过我不应该对 URL 使用主键,对于这个特定的模型来说,存根不是一个好的选择。根据该链接中的建议,我在 Python 解释器中使用 zlib.crc32() 并发现值通常返回负数,这是我不希望在我的 URL 中出现的。我应该使用更好的哈希来生成我的 URL 吗?
更新:我最终使用了 David 下面建议的按位 XOR 掩码方法,效果非常好。感谢大家的意见。
首先,“不要在 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 也会改变。这可能没问题,但这是您需要考虑的事情。