Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 26, 2014 02:34:12

vasyank
Зарегистрирован: 2014-11-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка на повторяемость уникального кода...

Задача такая при создание объекта класса, ему должен присваиваться уникальный хеш-код состоящий из 10-15 знаков, нижний, верхний регистр и цифры.
А вот как исключить присвоение одинаковых хешей или как их исключить генерацию 2х одинаковых, разобраться не могу


class A()
def __init__(self,name):
       self.name=name
       self.hash_code=A.random_code
def random_code(self):
        random_string = ''
        for i in range(random.randint(10, 15)):
            random_string += random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits)
            return random_string

Отредактировано vasyank (Ноя. 26, 2014 10:54:13)

Офлайн

#2 Ноя. 26, 2014 08:01:00

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Проверка на повторяемость уникального кода...

id(object)
Return the “identity” of an object. This is an integer (or long integer) which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.

CPython implementation detail: This is the address of the object in memory.

Если очень надо, можно в связке с UUID/GUID.

Отредактировано Shaman (Ноя. 26, 2014 08:01:28)

Офлайн

#3 Ноя. 26, 2014 09:31:16

vasyank
Зарегистрирован: 2014-11-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка на повторяемость уникального кода...

Shaman
id(object)
классно конечно но если чесно не представляю как реализовать проверку? как сравнить ид обьекта с уже существующими ид?

Офлайн

#4 Ноя. 26, 2014 10:23:19

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Проверка на повторяемость уникального кода...

vasyank
классно конечно но если чесно не представляю как реализовать проверку? как сравнить ид обьекта с уже существующими ид?
Очевидно
id(obj_a) == id(obj_b)

Офлайн

#5 Ноя. 26, 2014 10:53:14

vasyank
Зарегистрирован: 2014-11-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка на повторяемость уникального кода...

Допустим нам дается список имен, каждое имя списка мы определяем как обьект класса А, и присваеваем каждому хеш. Не совсем понимаю что с чем сравнивать,в рамках этого класса random_string и A.random_code?

Отредактировано vasyank (Ноя. 26, 2014 10:53:49)

Офлайн

#6 Ноя. 26, 2014 11:11:07

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Проверка на повторяемость уникального кода...

Без проблем.

>>> a = object()
>>> id(a)
19825848
>>> id(123)
19953032
>>> id(3.14)
30283096
>>> id('string')
20182816
>>> b = a
>>> id(b)
19825848
>>> id(a) == id(b)
True
>>> 
А если оставаться в рамках вашего подхода, тогда нужно использовать https://docs.python.org/2/library/uuid.html#example , или производные алгоритмы.

https://ru.wikipedia.org/wiki/UUID

Отредактировано Shaman (Ноя. 26, 2014 11:16:24)

Офлайн

#7 Ноя. 26, 2014 11:26:44

vasyank
Зарегистрирован: 2014-11-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка на повторяемость уникального кода...

Дело в том что по условиям задачи хеш должен быть от 10 до 15 символов нижний рег+верхний рег.+ цифры. А как то обратиться ко всем имеющимся ид обьектов можно?
что то типо:

def random_code()
.........................
     if id(random_string) not in .....(все id):
          return random_string
     else :
          return A.random_code()

Отредактировано vasyank (Ноя. 26, 2014 11:29:28)

Офлайн

#8 Ноя. 26, 2014 11:32:55

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Проверка на повторяемость уникального кода...

vasyank
Дело в том что по условиям задачи хеш должен быть от 10 до 15 символов нижний рег+верхний рег.+ цифры.
Нагенерите из uuid-ов. Их туда, на глаз, как минимум два влезет.

vasyank
if id(random_string) not in …..(все id):
Условие никогда не выполнится.

Офлайн

#9 Ноя. 26, 2014 11:57:20

vasyank
Зарегистрирован: 2014-11-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка на повторяемость уникального кода...

окей если вызывать

uuid.uuid4
C заменой - на “” (потмоу как - выпадает из условия задачи), а вот как сделать что бы из этого выбирался срез от 10 до 15 символов

Офлайн

#10 Ноя. 26, 2014 12:26:49

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Проверка на повторяемость уникального кода...

Почему именно uuid4?

vasyank
как сделать что бы из этого выбирался срез от 10 до 15 символов
А тут больше про математику чем про питон. Считайте идентификаторы числами, выраженными в произвольной системе исчисления.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version