2011-07-20 15 views
11

電話や電子メールで簡単に渡すことができる一意のID値を生成するにはどうすればよいでしょうか。それは容易に推測できないうちに簡単に記憶できます。Pythonで人にやさしい一意のIDを生成するには?

私はデータベースを使用しています。しかし私が人にIDを渡しているとき、私はIDをデータベースにバインドしたくありません。私は何か私はすでにデータベースに持っているユニークなIDとすることができますが、それを推測するのを避けるために直接使用することはできません。

私は、Pythonを使用していますし、uuidを使用して試してみましたが、uuidが読める人間であるには余りにも長いです。

人にやさしい発音可能IDを作成する方法はありますか?

+0

ユニークなのはどの基地ですか?データベースを持っていますか、次の値との衝突の可能性のないランダムな文字列/数値を作成しますか?あなたの問題についてもっと教えてください。 – schlamar

+0

@ ms4py質問が編集されました。 – iamgopal

+0

'hash(str(your_id))についてはどうですか? – schlamar

答えて

0

ここにはuuidベースの例があります。 1000000を調整してIDの範囲を増減します。 IDの範囲を狭めるので、おそらくIDが既に存在するかどうかを確認する必要があります。

>>> import uuid 
>>> hash(str(uuid.uuid1())) % 1000000 
380539 
>>> hash(str(uuid.uuid1())) % 1000000 
411563 
+1

ランダム性は一意性とは関係ありません。 – delnan

+1

同じオブジェクトの後で同じIDを後で再現する必要がない場合、乱数を使用することは、同じサイズのハッシュを使用することと完全に同じです。 – agf

2

Amazonの支払い文句はどうですか。バイナリIDを一連の英語に変換します。

UUIDと同じ範囲のものを使用する場合は、16バイトを表す必要があります。 妥当性を保つには、フレーズを4ワードに制限します。したがって、各ワードは4バイトまたは65536個の可能性を表します。したがって、262,144ワードの辞書が必要です。

EDIT: 実際には、リフレクションには、気違いのlib文があります。これは、必要な単語の数を制限し、文法的な構造を持っているため覚えやすくなります。もちろん、おそらくこれ以上の長さにする必要があります:

(a/an/the /#)(adjb)(動詞)(副詞)while(a/an/the /#)(adj)(名詞)(動詞)(副詞)。

+0

「Foo Foo Foo Foo」を有効なペイフレーズとして許可した場合は、65536語です。 – agf

+0

編集が複雑すぎます。辞書を読み込んで、 'memorable_id = '' .join(辞書[random.randint(0、65535)]を使って範囲(4)のヌル)'の方が良いです。 – agf

11

あなたがしたいことは、発音可能な擬似単語を作成するために音節を綴じることです。あなたは発音され、伝えられるが実際には何も意味しない言葉を作りたいあらゆる言語の音節を作ることができます。

Here is an article about how one person created human readable UIDs for speaking them phonetically and some of the pitfalls.

このようなアプローチを取る際に考慮すべき落とし穴のほんの一部のために上記のリンクをお読みください。

アルファベット文字の文字列を使用できますが、アルファベットだけでなくNATO phonetic alphabetとして表示できます。

0

確かに、それはつまり、あなたの問題空間、上のいくつかのより多くの制限を必要とは:

  1. あなたの項目はタイトルのいくつかの概念を持っているユニークなIDを生成する一つだけあり
  2. することができます

    _UID_INTERNALS = set() 
    
    def getID(obj): 
        if hasattr(obj, 'UID'): 
         return obj.UID 
        title = obj.title.encode("ascii", errors="ignore") 
        title = title.lower() 
        title = "-".join(title.split()) 
        if not title: 
         title = "unnamed-object" 
        UID = title 
        num = 1 
        while UID in _UID_INTERNALS: 
         UID = title + str(num) 
         num += 1 
        _UID_INTERNALS.add(UID) 
        obj.UID = UID 
        return UID 
    
    :文字列のリストを持続

次に、あなたのような何かをしたいですメールの

+0

上記と同様に、このコードで何が問題になっていますか?それは完全に適切に動作し、述べたようにあなたの質問を解決します。 – MatthewWilkes

3

、私が使用することです:

from base64 import b64encode 
from os import urandom 
key = b64encode(urandom(9)) 

あなたは/番号を変更することで長さを減らす増やすことができます。 時には+と/の文字が得られ、好きなときにそれらを取り除くことができます。

編集: あなたも電話でそれらを渡したいので、それは文句を言わないあなたに任意の小文字や特殊記号を与えるので、多分b32encode(urandom(5))がより良い選択でしょう。

+1

私はこれを自分で使っているので、なぜこれが悪い考えであるか説明してください。 – nima

関連する問題