Russian Qt Forum

Qt => Вопросы новичков => Тема начата: AntonUfo от Ноябрь 17, 2011, 10:22



Название: Не переводится строка в число, для того что бы использовать как ключ Хэша
Отправлено: AntonUfo от Ноябрь 17, 2011, 10:22

Прошу помощи, прочитал вот эту тему, http://www.prog.org.ru/topic_10606_0.html, пытаюсь перевести строку в число, для того что бы использовать число в качестве ключа Хэша, но ничего не получается, val = 0 и все....

QString str = tr("fdsfsdfsdfsdfsdf ");
bool validNumber;
quint32 val = str.toInt( &validNumber, 16 );


Название: Re: Не переводится строка в число, для того что бы использовать как ключ Хэша
Отправлено: LisandreL от Ноябрь 17, 2011, 10:27
А чего вы собственно ожидали?
"fdsfsdfsdfsdfsdf " - это не шестнадцатиричное число, вот "deadbeaf" - переведётся.


Название: Re: Не переводится строка в число, для того что бы использовать как ключ Хэша
Отправлено: AntonUfo от Ноябрь 17, 2011, 10:48
А чего вы собственно ожидали?
"fdsfsdfsdfsdfsdf " - это не шестнадцатиричное число, вот "deadbeaf" - переведётся.

только что это понял, но все равно спасибо...

Тогда вопрос такой:
Программой генерируются специальным образом строки, пусть к примеру:
"dfsdfsdfsdfsdfsdf"
"sdfdsfsdfdsadsdfsa"
"sdfsdfsdfsdfsdfsdfsdf"
и.т.д.

Можно ли для каждой строки каким либо образом генерировать уникальный цифровой ключ ?

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


Алгоритм примерно нужен такой:

MyClass{
строка
количество повторов
...
...
другая нужнаяинформация
}

получили строчку, расчитали ее уникальный ключ, если хэш пустой то впихнули в Хэш (ключ, MyClass),
опять получили строчку, расчитали ключ, если в хэше уже есть такой ключ то увеличили счетчик повторов для такой строки на 1, если в хэше нет такого ключа добавим новую запись в хэш... и т.д. в цикле....


Название: Re: Не переводится строка в число, для того что бы использовать как ключ Хэша
Отправлено: Rem Norton от Ноябрь 17, 2011, 11:03
Считай на здоровье:
Код
C++ (Qt)
const quint32 Crc32Table[256] = {
   0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
   0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
   0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
   0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
   0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
   0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
   0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
   0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
   0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
   0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
   0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
   0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
   0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
   0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
   0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
   0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
   0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
   0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
   0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
   0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
   0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
   0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
   0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
   0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
   0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
   0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
   0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
   0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
   0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
   0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
   0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
   0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
   0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
   0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
   0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
   0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
   0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
   0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
   0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
   0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
   0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
   0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
   0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
   0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
   0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
   0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
   0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
   0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
   0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
   0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
   0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
   0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
   0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
   0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
   0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
   0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
   0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
   0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
   0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
   0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
   0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
   0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
   0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
   0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
};
 
quint32 crc32(QByteArray buf)
{
   quint32 res = 0xFFFFFFFF;
   if (!buf.isEmpty())
   {
       for (int i = 0 ; i < buf.count() ; i++)
           res = (res >>8) ^ Crc32Table[(res^buf.at(i)) & 0xFF];
   }
   return res ^ 0xFFFFFFFF;
};
 
 


Название: Re: Не переводится строка в число, для того что бы использовать как ключ Хэша
Отправлено: AntonUfo от Ноябрь 17, 2011, 11:21
Считай на здоровье:

спасибо :), а можно немного объяснений что это и как пользоваться ?


Название: Re: Не переводится строка в число, для того что бы использовать как ключ Хэша
Отправлено: Rem Norton от Ноябрь 17, 2011, 11:56
Считаешь CRC32 строки, это будет 32-х битное целое. Вот он твой хэш-ключ.


Название: Re: Не переводится строка в число, для того что бы использовать как ключ Хэша
Отправлено: twp от Ноябрь 17, 2011, 13:08
а чем не устроил uint qHash ( const QString & key )?


Название: Re: Не переводится строка в число, для того что бы использовать как ключ Хэша
Отправлено: AntonUfo от Ноябрь 17, 2011, 15:37
а чем не устроил uint qHash ( const QString & key )?


как им правильно воспользоваться ?


Название: Re: Не переводится строка в число, для того что бы использовать как ключ Хэша
Отправлено: twp от Ноябрь 17, 2011, 17:45
Код:
 #include <QHash>
....
QString str = tr("fdsfsdfsdfsdfsdf ");
quint32 val = qHash(str);
:)


Название: Re: Не переводится строка в число, для того что бы использовать как ключ Хэша
Отправлено: AntonUfo от Ноябрь 17, 2011, 22:22
Считай на здоровье:

попробовал использовать const quint32 Crc32Table[256], так же попробовал использовать в качестве ключа сразу строку, но по скорости так же как если делать через QList без использования хэша.....
возник такой вопрос, можно ли при использовании const quint32 Crc32Table[256] каким нибудь способом учитывать что в строке могут быть только пробелы и числа до 10, может таким образом возрастет скорость получения индивидуального ключа ?

я правильно понимаю что это:

    0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
    0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
    0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
    0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
    .......................................................................
 32 битное представление букв и цифр ?


Название: Re: Не переводится строка в число, для того что бы использовать как ключ Хэша
Отправлено: Rem Norton от Ноябрь 17, 2011, 23:07
я правильно понимаю что это:

    0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
    0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
    0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
    0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
    .......................................................................
 32 битное представление букв и цифр ?
Нет. Вся инфа есть вот тут (http://ru.wikipedia.org/wiki/%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B8%D0%B7%D0%B1%D1%8B%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4)

P.S. А что вообще ускорить надо? Впечатление такое, что раскопки пошли не в том направлении вообще.


Название: Re: Не переводится строка в число, для того что бы использовать как ключ Хэша
Отправлено: AntonUfo от Ноябрь 18, 2011, 09:47
P.S. А что вообще ускорить надо? Впечатление такое, что раскопки пошли не в том направлении вообще.

выше я уже написал, попробую еще раз:

некий алгоритм постоянно генерирует строки, каждая строка может содержать пробелы и цифры от 0 до 10 к примеру:
"0 0 2 3 0 5 "
" 4 5 8 9 3 0"
"9 8 6 8 4 3 7 6 2 9 10"

создаю список в котором буду сохранять следующую структуру: принятая строка, количество повторений...
т.е. получая i -ю строку необходимо:
посмотреть есть ли такая строка в списке (все равно как список будет организован, лишь бы работало максимально быстро)
если такой строки нет, добавляю в список
если такая строка есть увеличиваю для нее счетчик повтора на 1


на выходе получается вот такой список:
   строка                                    повторов
"0 0 2 3 0 5 "                                   2
" 4 5 8 9 3 0"                                  10
"9 8 6 8 4 3 7 6 2 9 10"                      0

мне нужно что бы алгоритм работал максимально быстро, т.к. строк будет много, и повторов ожидается то же много....


Название: Re: Не переводится строка в число, для того что бы использовать как ключ Хэша
Отправлено: Igors от Ноябрь 18, 2011, 11:19
Здесь важно: hash ключ НЕ уникален. Hash-таблица сначала ищет по ключу, а затем (еще) проверяет оператором ==
Поэтому нет смысла слишком заморачиваться с алгоритмом ключа - просто любой разумный. Ну и если хотите "выжать максимум скорости" - избавьтесь от QString