独特的SHA-1摘要生成

时间:2012-06-14 20:54:18

标签: python sha

在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),但我确信有更优雅的方法可以解决这个问题。

建议?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

您至少有两种方法可以创建唯一标识符:

  1. 使用增量值(通常为整数)生成唯一键
  2. 使用例如。 UUID(通用唯一标识符)
  3. 增量标识符

    第一个选择是显而易见的:无论是在数据库层还是在应用程序层执行,您都需要存储最后生成的标识符的信息,这样您就可以通过递增来生成另一个标识符。

    示例解决方案在这里:

    >>> 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。

    通用唯一标识符

    第二种选择是使用适当的工具来完成正确的任务:UUID专门为您提供唯一标识符。

    有一个名为UUID的模块与标准Python安装捆绑在一起,您可以使用它:

    >>> 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'
    

答案 2 :(得分:1)

如何将1添加到第一个,2添加到第二个?

我不太了解python,但是想法就是写

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

并拥有类compute

unique_id = hashlib.sha1(str(time.time()+offset)).hexdigest()