воскресенье, 25 июля 2010 г.

Способы генерации уникальных ID в python

Разбираясь с freebase, а в частности с генерацией machine ID. Задался вопросом: какие методы генерации уникальный ID существуют в python. Данный пост является кратким обзором методов.

Метод 1
Наверное самый простой путь - это использование модуля uuid из стандартной библиотеки python. Модуль предоставляет возможность генерации уникальных ID четырьмя методами, которые описаны в RFC4122

uuid1 позволяет генерировать уникальные ID состоящие из host ID, последовательного числа и текущего времени.
>>> uuid.uuid1()
UUID('0c6eab40-97ad-11df-b10d-00215c5600a3')

uuid3 и uuid5 в некотором смысле похожи, так как используют в качестве аргументов namespace и name. Тольк в uuid3 используется MD5 алгоритм, а uuid5 SHA-1
>>> uuid.uuid3(uuid.NAMESPACE_DNS, 'ownport.net')
UUID('66b1a6a0-4290-31bc-9593-dd600cdbde84')
>>> uuid.uuid5(uuid.NAMESPACE_DNS, 'ownport.net')
UUID('d7ea238f-eed2-5150-abc0-97a56e9da78c')

для случая, если нужно сгенерировать случайный ID, используется uuid4
>>> uuid.uuid4()
UUID('d1c2aab0-d92e-4bdb-8bc9-bbeb7a1f686a')

Метод 2

использование функции os.urandom(n), возвращающей строку из n случайных байт, позволяет генерировать случайные последовательности
>>> print ''.join([hex(ord(c)).replace('0x','') for c in os.urandom(8)])
'a0103cfe4991cf98'

в приведенном примере для генерации ID используется случайная 8 байтовая последовательность.

Метод 3

В данном методе для генерации уникального ID используется расчет функции MD5 от двух timestamp-ов с добавлением префикса.
import os
import time
import random
import hashlib

def getNewSID(tag):
    ''' Build a new session ID '''
    t1 = time.time()
    time.sleep(random.random())
    t2 = time.time()
    base = hashlib.md5(tag + str(t1+t2)).hexdigest()
    return '_'.join((tag, base))

>>> print getNewSID(‘ownport’)
‘ownport_a1c0a8213096c7896982504d64dbd7a7’

Примечание: исходный код был несколько адаптирован для работы с python 2.7.

0 комментариев:

Отправить комментарий