2

Python では、それぞれが一意の識別子を持つ 3 つのオブジェクトを作成しています。

これらすべてのオブジェクトでこの一意の識別子を生成する方法は次のとおりです。

class Foo(object):
    def __init__(self):
        unique_id = hashlib.sha1(str(time.time())).hexdigest()

次のように、これらのオブジェクトを次々と作成します。

a = Foo()
b = Foo()
c = Foo()

これらのインスタンスはすべてunique_id、作成の間に十分な時間が経過していないため、最終的に同じになります。

私はsleep(0.1)オブジェクトの作成の間に を配置することに頼りましたが、この問題を解決するためのよりエレガントな方法があると確信しています。

提案?

4

3 に答える 3

5

Pythonオブジェクトには、すでに一意の識別子があります。これはidです。ただし、これはオブジェクトが存在している限りユニークです。idオブジェクトが削除された後、再利用できます。

uuid標準ライブラリのモジュールを使用することも、クラスにカウンターを保持することもできます。

class Foo(object):
    __COUNT = 0
    # or: __COUNT = random.randint(0, 2**N - 1)

    def __init__(self):
        self.unique_id = self.__COUNT  # or take the SHA1 of the count
        type(self).__COUNT += 1
于 2012-06-14T20:56:46.453 に答える
3

一意の識別子を作成するには、少なくとも 2 つの方法があります。

  1. 増分値 (通常は整数) を使用して、一意のキーを生成します
  2. 例を使用してください。UUID (Universally Unique Identifier)

増分識別子

最初の選択肢は明らかです。データベース レイヤーで実行する場合でも、アプリケーション レイヤーで実行する場合でも、最後に生成された識別子に関する情報を保存する必要があるため、それをインクリメントして別の識別​​子を生成できます。

解決策の例は次のとおりです。

>>> class Incremental(object):
    _last_id = 0
    def __init__(self):
        Incremental._last_id += 1
        self.id = Incremental._last_id


>>> class MyClass(Incremental):
    def __repr__(self):
        return 'MyClass with id=%s' % self.id


>>> a = MyClass()
>>> b = MyClass()
>>> c = MyClass()
>>> a, b, c
(MyClass with id=1, MyClass with id=2, MyClass with id=3)

他の人が提案したものを見てみましょう - 増分 ID に関しては、彼らの提案の方が適しているかもしれません。

普遍的に一意の識別子

2 番目の選択肢は、適切なタスクに適切なツールを使用することです。UUID は、一意の識別子を提供するように特別に設計されています。

これに使用できる標準の Python インストールにバンドルされているUUIDと呼ばれるモジュールがあります。

>>> import uuid
>>> str(uuid.uuid1())
'0baa65ea-b665-11e1-b721-b80305056d6a'

それらをハッシュに変換する

必要に応じて、両方の値を SHA-1 ハッシュに変換できます。

>>> import hashlib
>>> hashlib.sha1(str(1)).hexdigest()
'356a192b7913b04c54574d18c28d46e6395428ab'
>>> hashlib.sha1('0baa65ea-b665-11e1-b721-b80305056d6a').hexdigest()
'46bd64c5f4a81b90539d7302d030e01378ef6d6e'
于 2012-06-14T21:06:05.057 に答える
1

最初に1を追加し、2番目に2を追加するのはどうですか?

私はそれを修正するのに十分なPythonを知りませんが、アイデアは書くことです

a = Foo(0)
b = Foo(1)
c = Foo(2)

クラスに計算させます

unique_id = hashlib.sha1(str(time.time()+offset)).hexdigest()
于 2012-06-14T20:57:16.310 に答える