За последние 24 часа нас посетили 22560 программистов и 1009 роботов. Сейчас ищут 683 программиста ...

уникальность md5

Тема в разделе "Вопросы от блондинок", создана пользователем joost, 27 июл 2008.

  1. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    а почему нет? текст преобразуется в итоге в точно такие же байты, как и число)
     
  2. joost

    joost Guest

    надо имено по большому
    уточнил вопрос в теме топика. глянь пожалуйста!
    не понял! :)
     
  3. dAllonE

    dAllonE Guest

    joost, я сегодня что-то туго соображаю.

    Как я понимаю:

    1. Есть какой-то большой текст.
    2. Ты делаешь из него md5 хэш.
    3. В таблице есть поле CHAR(32) и по нему сделан уникальный индекс
    4. Ты туда запихиваешь md5 хэш и по нему определяешь есть ли у тебя такой текст уже в таблице или нет.

    Такая схема вполне себе работает и все отлично. (За исключением времени создания MD5 хэша от ОЧЕНЬ больших текстов/файлов).

    Я все правильно понял?
     
  4. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0

    ну, для субд любые данные - набор байтов. и в индексе хранится не число 1 или строка "птыцо дурак", а соответствующие им наборы байтов.
     
  5. joost

    joost Guest

    да
    да
    нет. есть поле text - в нем хранится текст. по нему (по тексту) сделан уникальный индекс (это md5() от текста) полем bigint(20)

    в отдельное поле bigint(20)

    Например
    code_model, name_model
    md5(телефон Lg B1300 с наушниками и т. д.), телефон Lg B1300 с наушниками и т. д.


    Проблема в том, что md5(телефон Lg B1300 с наушниками и т. д.) это будет число в 16 ричной системе числения, а в БД в поле bigint(20) записывается простое число (не уверен, но наверное в 10 ричной системе). Как формируется это число, которое записывается в таблицу БД? Будет ли оно уникальным?
     
  6. dAllonE

    dAllonE Guest

    joost, Чисто ИМХО, на истину не претендую:

    1. Максимальное значение которое можно хранить в BIG INT Unsigned: 2^64 = 18446744073709551616
    2. md5 хэш - 128 бит. => 2^128 = 3,4028236692093846346337460743177e+38

    Итого либо взять столбец типа DOUBLE, либо индекс делать по CHAR(32) и не парить себе мозг.
     
  7. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    ИМХО
     
  8. joost

    joost Guest

    тоесть обрезать текст до 32 символов? уникальный индекс делать отдельным полем (md5 от строки в bigint(20) ) таблици или текстовое поле (обрезаное до 32 ) делать уникальным индексом?
     
  9. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Жесть. md5 от текста это 32 символа. вот эти 32 символа туда и запиши!!!!111
     
  10. joost

    joost Guest

    как сделать уникальным индекс по текстовому полю? там вроде длину индекса (количество символов, которые учитывать) надо указывать. как это делать? какой сиснтаксис запроса на создание такого индекса?
     
  11. dAllonE

    dAllonE Guest

    joost, ты захавал мой мозг. Весь до последней капли.
    Цени алгортим:

    0. Делаешь ALTER TABLE `table_name` ADD `hash` CHAR( 32 ) NOT NULL
    1. Делаешь ALTER TABLE `table_name` ADD UNIQUE (`hash`)
    2. Делаешь md5 хэш своего большого текста.
    3. Получившийся хэш размером 32 символа пишешь в БД.
    4. Радуешься уникальному хэшу своего большого текста и пишешь, что тему можно закрывать.


    Это нужно делать, если ты делаешь индекс по полю типа TEXT. Мы же его делаем по CHAR(32). Поэтому все будет ок и так.
     
  12. dAllonE

    dAllonE Guest

    Sergey89 + 1 :)
     
  13. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    dAllonE
    у бигинтегера знак есть - последний бит, итого 2^63.
     
  14. dAllonE

    dAllonE Guest

    antonn, я писал:

    Ибо, я думаю, вряд ли md5 выдаст отрицательный хэш...
     
  15. joost

    joost Guest

    в поле CHAR(32) сколько символов строки влезет? всего 32?
    какая разница между char и varchar?
     
  16. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    joost, издеваешься? Прочти ты наконец уже документацию по MySQL. http://dev.mysql.com
     
  17. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    ну, в принципе, если никаких арифметических операций не предвидится, то можно попробывать и unsigned, однако в справке рекомендуется не юзать значения больше 2^63

    joost
    у varchar переменная длина при хранении, плюс хранится байт длины (и потому длина не может быть более 255 буковок)
     
  18. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Щас тебе скажут, что в варчар можно хранить до 65к символов :)
     
  19. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    в какой версии мускла для длины юзают word вместо байта? :)
     
  20. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Там всё несколько сложнее. 65к это максимальное число, которое могут разделить между собой варчар столбцы.
     
  21. joost

    joost Guest

    может глупый вопрос.
    одной таблици?
     
  22. dAllonE

    dAllonE Guest

    Ну он туда md5 хэш планировал просто кидать. А не рекомендуется больше 63 бит держать только при выполнении арифметических операций (не битовых)..
     
  23. dAllonE

    dAllonE Guest

    Все. Я так больше не могу. К блондинкам.
     
  24. joost

    joost Guest

    :)
    слабонервный! не в обиду!
     
  25. joost

    joost Guest

    а можно ALTER TABLE `table_name` ADD `hash` int( 32 ) ? Чем лучше или хуже CHAR( 32 )?