2012-05-11 3 views
4

データベースオブジェクトのURLを生成しようとしています。 I've read URLにプライマリキーを使用しないでください。この特定のモデルでは、スタブは適切なオプションではありません。そのリンクのアドバイスに基づいて、私はPythonインタプリタでzlib.crc32()を使いこなし、値がしばしば負の数を返すことがわかりました。これは私のURLには望ましくありません。 URLを生成するために使用するより良いハッシュはありますか?django:データベースオブジェクトの主キーからURLをハッシュするにはどうすればよいですか?

UPDATE:私は以下のデビッドによって提案されたビットごとのXORマスキング方法を使用して終了し、それは素晴らしい作品。あなたのご意見をお寄せいただきありがとうございます

+0

頼んだことではないので(答えではありません)、タイトルをスリルして、それを使用することを検討するかもしれません。基本的には合法的になるまで下げ/スクラブ/リダクションし、オブジェクトのフィールドとして(索引付けされて)保存し、それと一致するurls.pyのパターンを持つようにします。 –

+0

[urlauth](http://pypi.python.org/pypi/django-urlauth/0.1.8)アプリをご覧ください。それはあなたのニーズを解決することはできませんが、どのようにURLを構成し、キーをDBに保存し、要求時にURLを検証するかを見ることができます。 – AJJ

+0

@PeterRowellこれらはおそらくURLによって任意にアクセスされないため、数値を使用する方がよいでしょう。 – raddevon

答えて

10

まず、「URLにプライマリキーを使用しない」は、非常に弱いガイドラインです。 インクリメンタル整数ID を使用している場合、それらの数値を公開したくない場合は、少し難読化することができます。たとえば、masked_id = entity.id^0xABCDEFABunmasked_id = masked_id^0xABCDEFABを使用できます。

第2に、あなたがリンクした記事はです。疑わしいです。私はそれを信じません。まず、CRC32は一方通行のハッシュ関数です。一般的に、CRC32ハッシュを取得し、そのハッシュを作成するために使用した文字列を取得することは不可能です。彼はCustomerのCRC32がpkであることを調べる方法を示していないことがわかります。第二に、記事のコードは意味をなさない。 zlib.crc32関数はバイト文字列を要求し、Customer.idは整数になります。

第3に、URLにスラッグを使用する場合は注意してください。スラッグが変更されると、URLも変更されます。これは大丈夫かもしれませんが、考慮する必要があります。

+0

これは素晴らしい情報です。私はそれを熟考します。ありがとうございました! – raddevon

関連する問題