Russian Qt Forum
Ноябрь 24, 2024, 00:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не переводится строка в число, для того что бы использовать как ключ Хэша  (Прочитано 5273 раз)
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 );
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Ноябрь 17, 2011, 10:27 »

А чего вы собственно ожидали?
"fdsfsdfsdfsdfsdf " - это не шестнадцатиричное число, вот "deadbeaf" - переведётся.
Записан
AntonUfo
Гость
« Ответ #2 : Ноябрь 17, 2011, 10:48 »

А чего вы собственно ожидали?
"fdsfsdfsdfsdfsdf " - это не шестнадцатиричное число, вот "deadbeaf" - переведётся.

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

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

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

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


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

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

получили строчку, расчитали ее уникальный ключ, если хэш пустой то впихнули в Хэш (ключ, MyClass),
опять получили строчку, расчитали ключ, если в хэше уже есть такой ключ то увеличили счетчик повторов для такой строки на 1, если в хэше нет такого ключа добавим новую запись в хэш... и т.д. в цикле....
Записан
Rem Norton
Гость
« Ответ #3 : Ноябрь 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;
};
 
 
Записан
AntonUfo
Гость
« Ответ #4 : Ноябрь 17, 2011, 11:21 »

Считай на здоровье:

спасибо Улыбающийся, а можно немного объяснений что это и как пользоваться ?
Записан
Rem Norton
Гость
« Ответ #5 : Ноябрь 17, 2011, 11:56 »

Считаешь CRC32 строки, это будет 32-х битное целое. Вот он твой хэш-ключ.
Записан
twp
Гость
« Ответ #6 : Ноябрь 17, 2011, 13:08 »

а чем не устроил uint qHash ( const QString & key )?
Записан
AntonUfo
Гость
« Ответ #7 : Ноябрь 17, 2011, 15:37 »

а чем не устроил uint qHash ( const QString & key )?


как им правильно воспользоваться ?
Записан
twp
Гость
« Ответ #8 : Ноябрь 17, 2011, 17:45 »

Код:
 #include <QHash>
....
QString str = tr("fdsfsdfsdfsdfsdf ");
quint32 val = qHash(str);
Улыбающийся
Записан
AntonUfo
Гость
« Ответ #9 : Ноябрь 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 битное представление букв и цифр ?
Записан
Rem Norton
Гость
« Ответ #10 : Ноябрь 17, 2011, 23:07 »

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

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

P.S. А что вообще ускорить надо? Впечатление такое, что раскопки пошли не в том направлении вообще.
« Последнее редактирование: Ноябрь 17, 2011, 23:10 от Rem Norton » Записан
AntonUfo
Гость
« Ответ #11 : Ноябрь 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

мне нужно что бы алгоритм работал максимально быстро, т.к. строк будет много, и повторов ожидается то же много....
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Ноябрь 18, 2011, 11:19 »

Здесь важно: hash ключ НЕ уникален. Hash-таблица сначала ищет по ключу, а затем (еще) проверяет оператором ==
Поэтому нет смысла слишком заморачиваться с алгоритмом ключа - просто любой разумный. Ну и если хотите "выжать максимум скорости" - избавьтесь от QString
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.114 секунд. Запросов: 23.