- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 
                        QString generateGuid( const std::string &tDeviceSerial,
        const std::string &nDatetime, const std::string &licnum,
        const char *violation )
{
    std::ostringstream s;
    s << tDeviceSerial;
    s << nDatetime;
    s << licnum;
    s << violation;
    
    QCryptographicHash hash( QCryptographicHash::Md5 );
    hash.addData( QByteArray( s.str().c_str() ) );
    QByteArray result = hash.result();
    return convToHex( (unsigned char*)result.data(), result.size() );
}
                                 
        
            Оно, конечно, работает. Но разобраться в таком коде....
        
        
Они насилуют гуиды!
Слепили строчку - получили для нее МД5-й хэш - вернули его в виде hexadecimal. Все просто, понятно, линейно.
Я пока только одно говнокодство вижу: полученная строчка - это ни разу не ГУИД, который, как известно, несколько длиннее и имеет фиксированную структуру. Да и не должны ГУИДы быть одинаковыми при одинаковых входных данных функции - они же все-таки глобально уникальные.
Впрочем, это все лирика. Ну, назвал функцию неправильно пацан, написал GUID вместо Hash - что ж теперь, всем смеяться полчаса?
Нет и еще раз нет. Это даже в чем-то неполиткорректно: смеяться над крестоебами. Они же, бедняши, совсем как дети-имбецилы.
1. Нахрена ostringstream?
2. нахрена объект QCryptographicHash, если у него есть статическая функция?
3. Нахрена convToHex, если QByteArray это сам умеет.
Меня на такие выводы толкает упорное использование контейнеров из STL. Кутишные контейнеры очень даже удобны и приятны в использовании, поэтому "гибриды" с std::string и прочими встречаются во всяких интерфейсных прокладках. Ну или в коде зеленых новичков в Qt. :)
> 1. Нахрена ostringstream?
Человек не привык использовать вкусности QString и юзает его как std::string. В общем случае, чтобы получить строку, слепленную из параметров произвольного типа, приходится пихать все в ostringstream.
Пацан, конечно, перемудрил слегка - у него кругом строки, можно было в одну тупо слить конкатенацией.
С другой стороны, его можно понять - мало ли как мысль у него шла. Может, он сначала планировал в функцию дату-время как число передавать, написал с ostringstream, а потом власть в стране переменилась и дату-время он стал передавать в виде строки.
Обычная ситуация.
2. нахрена объект QCryptographicHash, если у него есть статическая функция?
Если парень новичок в Кути, он мог и не заметить такой тонкости. Нашел пример использования класса в документации и сделал так же. Простительно и не страшно.
3. Нахрена convToHex, если QByteArray это сам умеет.
Для человека, не работавшего раньше с Кути, QByteArray практически никак не ассоциируется со строками. Он просто не знал, куда смотреть. Да даже если он и нашел описание QByteArray::toHex(), скорее всего, пожал плечами и пропустил - ему же строки нужны в результате, а не массивы байтов.
В этом смысле QCString из "старого" Qt был попроще для новичка. По крайней мере не было лишнего барьера в понимании, что это как-то относится к строкам.
Резюмируя: код, конечно, на троечку, но и не откровенное говно. Так, малость попахивает.
Пацана заставить разобраться с QByteArray и QString, показать, как принято в кутях использовать статические функции - и все у него будет хорошо. :)
Пытался. :( Там все глухо. Я ему сегодня втолковывал, что if (string.isEmpty () ) лучше, чем if (string != "") - он так и не согласился.
Таких нужно учить административными методами: за string!="" - лишать премии.
А начнет возбухать - попросить его рассказать в подробностях, как именно работает его вариант проверки, и если он не понимает, что там создается временный объект - пригрозить увольнением за несоответствие. Потому как это основы.
бывает в сотни раз хуже