私の python/pyramid アプリでは、Amazon s3 バケットに保存されている html ページをユーザーが生成できるようにしています。www.domain.com/2cxj4kl のように、各ページに個別のパスが必要です。URLに入れるランダムな文字列を生成する方法を理解しましたが、重複が気になります。これらの各文字列を既存の文字列のリストと照合して、何も上書きされないようにするにはどうすればよいですか? 各文字列を辞書または配列に入れて、新しい配列が作成されるたびに増え続ける配列/辞書をチェックすることはできますか? そのようなオブジェクトを成長させ続けることに問題はありますか? また、何らかの形でアプリのメモリに永続的に存在しますか? これどうやってするの?
2 に答える
既存の識別子のリストを一部のストレージに保存し、新しい識別子をリストと比較するアプローチは単純なケースでは機能しますが、たとえば数十億の識別子を保存する必要がある場合、または生成する場合は、これが難しい場合があります。複数のマシンでそれらを。これは、リストの保存、取得、比較などの作業も複雑にします。ロックは言うまでもなく、2人のユーザーがまったく同じ秒でページを作成することにした場合はどうなりますか?
Universally Unique Identifiers(UUID)の衝突の可能性は非常に低く、たとえば、次の5分間に惑星がブラックホールに飲み込まれる可能性よりもはるかに低くなります。非常に低いため、実用的な目的では無視できます。
Pythonには、UUIDを生成するためのuuidというライブラリがあります
>>> import uuid
>>> # make a random UUID
>>> u = uuid.uuid4()
>>> u.hex
'f3db6f9a34ed48938a45113ac4b5f156'
結果の文字列は32文字の長さであり、長すぎる可能性があります。
または、次のようなランダムな文字列を生成することもできます。
''.join(random.choice(string.ascii_letters + string.digits) for x in range(12))
10〜15文字の長さでは、おそらくUUIDよりもランダムではありませんが、衝突の可能性は、たとえば、Amazonデータセンターの管理人が精神的になり、斧でサーバーを破壊する可能性よりもはるかに低くなります。データセンターに火をつける:)
私はPythonとプログラミングは初めてですが、ここで「ランダム文字列」のアイデアで見ることができるいくつかの問題があります:
短い文字列を使用している場合、おそらく同じ文字列を何度も生成することになります。一方、長い文字列を使用している場合、同じ文字列を取得する変更は少なくなります。ただし、どちらの場合も重複に注意する必要があります。したがって、必要な URL の数を見積もり、最適な文字列の長さを使用することをお勧めします。
最も簡単な方法は、これらの URL をリストに保持し、新しい URL を登録する前に単純な if チェックを使用することです。
url_list の new_url の場合: generate_new_url() そうしないと: url_list.append(new_url)
ただし、データベースを使用して URL を永続的に保存する必要があるようにも思えます。ほとんどの SQL ベースのデータベースでは、url 列を「一意」に設定できます。したがって、データベースは重複した URL を持つことを防ぎます。
よくわかりませんが、データベースを使用すると、おそらくこれを行うことができます:
試す: #データベースに値を挿入 を除外する: generate_new_url()