2016-04-20 11 views
0

それぞれのモデルに対して、衝突チェックを行い、完全一意の数値IDを生成したいと考えています。自動インクリメントIDを使用できないのは、idを予測可能にしたくないからです。私はまた、UUIDの使用を避けたいですが、英数字のIDでも問題ありません。私は、主キーを交換しないのですが、私はそれがこのようなdjangoで二次識別子の数値IDを生成

何か私のAPIでオブジェクトを取得使用しています:

8230693489356 

または:

a435Ga256hb35 

でもない:

ab66e4dd-4fee-4fb3-9519-efdc20e5d792 

これは重複していません:

  • 質問は私の問題を解決しない、それは質問者の質問を解決しなかった、受け入れられた答えはない。トップ答えは衝突が一意のIDをチェックし作成されません

  • 、衝突が回答の

  • ほとんどが起こることができ、私が欲しいものではありませんUUIDを、示唆しています。

  • この質問は、一意のIDを要求するだけで、具体的なものを求めています。

+0

可能な重複http://stackoverflow.com/questions/1210458/how-can-i-generate-a-unique-id-in- Python) – sobolevn

+0

@Sebastian Olsen解決策はありますか?私はあなたのために答えがあるので! – rakwen

答えて

0

あなたは一意のIDとだけではなく、別のランダムID

されるようにしたかったので、私はランダムに生成された整数にタイムスタンプとホスト名を追加しました。 あなたは簡単に推測できないはずですが、私は最終的な鍵を生成するためにmd5を使ってStringの上にハッシュしました。

import hashlib 
import random 
import time 
import string 
import socket 
import sys 
hostname = socket.gethostname() 
def new_id(n): 
    return hashlib.md5((str(random.randint(1,sys.maxsize))+hostname+str(time.time()*1000)).encode('utf-8')).hexdigest()[:n] 

>>> new_id(11) 
'8c05917c1c7' 
[私はPythonでユニークなIDを生成するにはどうすればよい?](の
+0

あなたはこれが衝突耐性であることを100%確信していますか?誰かが正確に同じ時刻に投稿したらどうなるでしょうか? –

+0

@SebastianOlsen誰かが同じホスト名から同時に投稿した場合。あなたはalphaNumeric文字のランダムなセットを持っています。タイムスタンプとホスト名を組み合わせると、ランダムキーの可能性は非常に低いです。かなりユニークでなければなりません。 – Vishnu667

+0

TypeError:ハッシュする前にUnicodeオブジェクトをエンコードする必要があります –

0
import string 
import random 

IDLENGHT = 8 

def generate_u_id(size=IDLENGHT,chars=string.ascii_uppercase + string.digits): 
    return ''.join(random.SystemRandom().choice(chars) for _ in range(size)) 
+0

これは、すでに同じ値のIDがないことをチェックしますか? –

+0

いいえ!それは安全です! – rakwen

+0

あなたは@ Vishnu667の答えのようにそれをより複雑にすることができます! – rakwen

関連する問題