欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在C++?Qt中實(shí)現(xiàn)異步散列器的代碼示例

 更新時間:2024年09月11日 08:29:12   作者:夢起丶  
在很多工作中,我們需要計算數(shù)據(jù)或者文件的散列值,例如登錄或下載文件,而在?Qt?中,負(fù)責(zé)這項工作的類為?QCryptographicHash,本文給大家介紹了在C++?Qt中實(shí)現(xiàn)異步散列器的代碼示例,需要的朋友可以參考下

【寫在前面】

在很多工作中,我們需要計算數(shù)據(jù)或者文件的散列值,例如登錄或下載文件。

而在 Qt 中,負(fù)責(zé)這項工作的類為 QCryptographicHash。

關(guān)于 QCryptographicHash

QCryptographicHash 是 Qt 框架中提供的一個用于生成加密散列(哈希值)的類。該類可以將任意長度的輸入(二進(jìn)制或文本數(shù)據(jù))轉(zhuǎn)換成固定長度的輸出(哈希值),這一過程是不可逆的。QCryptographicHash 支持多種哈希算法,包括 MD4、MD5、SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等,這些算法在數(shù)據(jù)完整性校驗、密碼存儲、數(shù)字簽名等應(yīng)用場景中非常有用。

主要特點(diǎn):

支持多種哈希算法:QCryptographicHash 提供了多種哈希算法的支持,允許開發(fā)者根據(jù)具體需求選擇合適的算法。

簡單易用的接口:QCryptographicHash 提供了簡單易用的接口來計算哈希值。開發(fā)者可以通過調(diào)用 QCryptographicHash::hash() 靜態(tài)方法或創(chuàng)建 QCryptographicHash 對象并使用 addData() 和 result() 方法來計算哈希值。

逐塊計算:`QCryptographicHash 還可以逐塊地計算哈希值,這對于處理大文件或流式數(shù)據(jù)非常有用。

可重復(fù)使用:QCryptographicHash 對象可以多次使用。當(dāng)計算完一個哈希值后,可以通過調(diào)用 reset() 方法重置對象,然后繼續(xù)計算新的哈希值。

然鵝, 雖然 QCryptographicHash 很優(yōu)秀,但它最大的問題在于其散列值的計算是同步的( 即阻塞 ),對小數(shù)據(jù)來說并沒什么影響,但對大數(shù)據(jù)來說則意味明顯卡頓。

因此,我將 QCryptographicHash 進(jìn)行簡單封裝,擴(kuò)展了實(shí)用性的同時并將計算改為異步,還增加了進(jìn)度通知和結(jié)束通知。

【正文開始】

先來看看 AsyncHasher 的使用效果圖:

AsyncHasher 的使用方法非常簡單:

  • 包含頭文件:在使用 AsyncHasher 之前,需要包含相應(yīng)的頭文件 #include "asynchasher.h"。

  • 通過 setSource / setSourceText / setSourceData/ setSourceObject 設(shè)置源目標(biāo)。

  • 通過 void hashProgress(qint64 processed, qint64 total) 來獲取進(jìn)度,void finished() 通知計算結(jié)束。

  • 通過 QString hashValue() const 獲取最終結(jié)果。

例如 C++ 使用:

    AsyncHasher *hasher = new AsyncHasher;
    hasher->setSourceText("Test Text");
    QObject::connect(hasher, &AsyncHasher::finished, [hasher]{
        qDebug() << hasher->hashValue();
    });

并且我還做了 Qml 適配,使用方法:

    AsyncHasher {
        id: textHasher
        algorithm: AsyncHasher.Md5
        onStarted: {
            startTime = Date.now();
        }
        onFinished: {
            totalTime = Date.now() - startTime;
            console.log("HashValue:", hashValue, "time:", totalTime);
        }
        property real startTime: 0
        property real totalTime: 0
    }

完整頭文件如下:

#ifndef ASYNCHASHER_H
#define ASYNCHASHER_H

#include <QCryptographicHash>
#include <QFuture>
#include <QObject>
#include <QUrl>

QT_FORWARD_DECLARE_CLASS(QNetworkAccessManager);

QT_FORWARD_DECLARE_CLASS(AsyncHasherPrivate);

class AsyncHasher : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QCryptographicHash::Algorithm algorithm READ algorithm WRITE setAlgorithm NOTIFY algorithmChanged)
    Q_PROPERTY(bool asynchronous READ asynchronous WRITE setAsynchronous NOTIFY asynchronousChanged)
    Q_PROPERTY(QString hashValue READ hashValue NOTIFY hashValueChanged)
    Q_PROPERTY(int hashLength READ hashLength NOTIFY hashLengthChanged)
    Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
    Q_PROPERTY(QString sourceText READ sourceText WRITE setSourceText NOTIFY sourceTextChanged)
    Q_PROPERTY(QByteArray sourceData READ sourceData WRITE setSourceData NOTIFY sourceDataChanged)
    Q_PROPERTY(QObject* sourceObject READ sourceObject WRITE setSourceObject NOTIFY sourceObjectChanged)

public:
    Q_ENUMS(QCryptographicHash::Algorithm);

    explicit AsyncHasher(QObject *parent = nullptr);
    ~AsyncHasher();

    QNetworkAccessManager *networkManager() const;

    QCryptographicHash::Algorithm algorithm();
    void setAlgorithm(QCryptographicHash::Algorithm algorithm);

    bool asynchronous() const;
    void setAsynchronous(bool async);

    QString hashValue() const;

    int hashLength() const;

    QUrl source() const;
    void setSource(const QUrl &source);

    QString sourceText() const;
    void setSourceText(const QString &sourceText);

    QByteArray sourceData() const;
    void setSourceData(const QByteArray &sourceData);

    QObject *sourceObject() const;
    void setSourceObject(QObject *sourceObject);

    bool operator==(const AsyncHasher &hasher);
    bool operator!=(const AsyncHasher &hasher);

    QFuture<QByteArray> static hash(const QByteArray &data, QCryptographicHash::Algorithm algorithm);

signals:
    void algorithmChanged();
    void asynchronousChanged();
    void hashValueChanged();
    void hashLengthChanged();
    void sourceChanged();
    void sourceTextChanged();
    void sourceDataChanged();
    void sourceObjectChanged();
    void hashProgress(qint64 processed, qint64 total);
    void started();
    void finished();

private slots:
    void setHashValue(const QString &value);

private:
    Q_DECLARE_PRIVATE(AsyncHasher);
    QScopedPointer<AsyncHasherPrivate> d_ptr;
};

#endif // ASYNCHASHER_H

【結(jié)語】

以上就是在C++ Qt中實(shí)現(xiàn)異步散列器的代碼示例的詳細(xì)內(nèi)容,更多關(guān)于C++ Qt異步散列器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c++插入排序詳解

    c++插入排序詳解

    插入排序的基本思想是每次將一個待排序的記錄,按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子文件中的適當(dāng)位置,直到全部記錄插入完成為止。下面我們來詳細(xì)探討下C++實(shí)現(xiàn)插入排序
    2017-05-05
  • C++實(shí)現(xiàn)STL容器的示例

    C++實(shí)現(xiàn)STL容器的示例

    本文主要介紹了C++實(shí)現(xiàn)STL容器的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • QT樹的具體項目實(shí)現(xiàn)

    QT樹的具體項目實(shí)現(xiàn)

    本文主要介紹了QT樹的具體項目實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • C語言求向量和的兩則問題解答分享

    C語言求向量和的兩則問題解答分享

    這篇文章主要介紹了C語言求向量和的兩則問題解答分享,分別是求連續(xù)子向量的最大和和任何連續(xù)最接近0的子向量的和的問題,需要的朋友可以參考下
    2016-04-04
  • C語言實(shí)現(xiàn)鏈隊列

    C語言實(shí)現(xiàn)鏈隊列

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)鏈隊列,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 詳解VisualS tudio Code開發(fā)Arm嵌入式Linux應(yīng)用

    詳解VisualS tudio Code開發(fā)Arm嵌入式Linux應(yīng)用

    本文介紹如何在 Visual Studio Code 中使用 Yocto Project 生成的 Linux SDK,并針對 Arm 處理器進(jìn)行 C/C++ 應(yīng)用交叉編譯和調(diào)試,感興趣的朋友跟隨小編一起看看吧
    2021-04-04
  • C++輸出斐波那契數(shù)列的兩種實(shí)現(xiàn)方法

    C++輸出斐波那契數(shù)列的兩種實(shí)現(xiàn)方法

    以下是對C++中輸出斐波那契數(shù)列的兩種實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • 探究c++虛表實(shí)現(xiàn)代碼

    探究c++虛表實(shí)現(xiàn)代碼

    虛表是一種利用程序語言實(shí)現(xiàn)的dynamic dispatch機(jī)制,或者說runtime method binding機(jī)制,也就是我們說的多態(tài)。本文簡單探究虛表實(shí)現(xiàn)方法,一起看看吧
    2021-09-09
  • C語言超詳細(xì)講解雙向帶頭循環(huán)鏈表

    C語言超詳細(xì)講解雙向帶頭循環(huán)鏈表

    帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨(dú)存儲數(shù)據(jù)。實(shí)際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實(shí)現(xiàn)以后會發(fā)現(xiàn)結(jié)構(gòu)會帶來很多優(yōu)勢,實(shí)現(xiàn)反而簡單
    2023-02-02
  • C語言中的三種循環(huán)語句

    C語言中的三種循環(huán)語句

    這篇文章主要介紹了C語言中的三種循環(huán)語句,在C語言中循環(huán)可分為3中,while循環(huán)、do - while循環(huán)、for 循環(huán)。下面小編就來為大家講解這三種循環(huán)語句,需要的朋友可以參考一下,希望對你有所幫助
    2021-10-10

最新評論