LINUX.ORG.RU

правильное хранение хеша в бд

 ,


0

2

Добрый вечер! Все еще ковыряю django. Понадобилось мне хранить в бд md5 хеш одного поля той же записи. Посему 2 вопроса:
в каком типе поля правильно хранить? в CharField не рационально, мозжечок подсказывает, что нужно числовое поле, но пока не нашел - как привести значение hashlib.md5(«any»).hexdigest() к числовому виду? это же 16ричное число, нет? понимаю, что вопрос глупый.
и возможно ли в модели сделать так

    name = models.CharField(max_length=200)
    text = models.TextField()
    text_hash = models.IntegerField(default = hashlib.md5(name).hexdigest()) #интересует вот эта строка
    creation_time = models.TextField(default = datetime.datetime.now())

и если возможно, то как? поле creation_time по умолчанию дает присвоить значение вычисляемое функцией.



Последнее исправление: cetjs2 (всего исправлений: 2)

matroskin

в CharField не рационально

Дональд Кнут

Преждевременная оптимизация - корень всех зол.
Premature optimization is the root of all evil.

Deleted
()
Ответ на: комментарий от Deleted

Тут не в тему. Выбор типа данных - это важно

dizza ★★★★★
()

Храни в charfield и не заморачивайся.
Или у тебя по этому полю выборки делаются? Если да - то покажи какие.

pi11 ★★★★★
()
Ответ на: комментарий от pi11

там не прокатит unique, в разных местах может быть одинаковый текст. нельзя что бы он был в одном месте. как то так

matroskin
() автор топика
Ответ на: комментарий от matroskin

Но если прямо хочется в int хранить, то вот -

>>> import hashlib
>>> a = hashlib.md5('test').hexdigest()
>>> a
'098f6bcd4621d373cade4e832627b4f6'
>>> int(a, 16)
12707736894140473154801792860916528374L
pi11 ★★★★★
()
Ответ на: комментарий от matroskin

так у тебя там же IntegerField, а это ни разу не integer для него. Поставь CharField.

gnunixon ★★★
()
Ответ на: комментарий от pi11

метод изменил, но ошибка та же.

text_hash = models.IntegerField(default = int(hashlib.md5(name).hexdigest(), 16))
TypeError: must be convertible to a buffer, not CharField

matroskin
() автор топика
Ответ на: комментарий от matroskin

Странная ошибка. Вобщем лучше перепиши метод save -

def save(self, force_insert=False, force_update=False, commit=True):
    m = super(MyModel, self).save(commit=False)
    self.text_hash = int(hashlib.md5(self.name).hexdigest(), 16)
    if commit:
        m.save()
    return m

pi11 ★★★★★
()
Ответ на: комментарий от matroskin

хм, если сделать так

    text_hash = models.IntegerField(default = int(hashlib.md5("name").hexdigest(), 16))


то ошибок нет. следовательно ошибка при передаче значения name. возможно ли его корректно передать в самом определении модели или для генерации хэша придется делать отдельный метод в модели?
matroskin
() автор топика
Ответ на: комментарий от pi11

Вы очень помогли мне. Работает, + практика переопределения методов класса - это круто. Спасибо Вам!

matroskin
() автор топика
Ответ на: комментарий от trashymichael

нет. я, конечно, только начинающий, но не совсем уж деревянный.

matroskin
() автор топика
Ответ на: комментарий от melkor217

Такими оптимизациями можно очень хорошо уменьшить объем базы. Например нужно всегда стараться использоваться int вместо longint.

dizza ★★★★★
()
Ответ на: комментарий от xpahos

Дело не в недостатке места. Будет медленее работать, так как по крайней мере не будет влазить в кэш в памяти. Предлагаешь 2Тб оперативки купить? Еще бекапы будут дольше. Вообще большие базы - сакс, геморой с ними один.

dizza ★★★★★
()

Во время реализации вывалилась еще одна проблема – длинна md5 составляет 128бит. Не влезает в BigIntegerField. Это подтолкнуло использовать zlib.crc32(). Супер точность не нужна, хэши записей будут сравниваться в пределах дерева, к которым они принадлежат. Вот такие дела.

matroskin
() автор топика
26 февраля 2014 г.
Ответ на: комментарий от zz

Я так и знал, что кто-нибудь ответит.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.