QHashSeed Struct
| 标题: | #include <QHashSeed> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| 自: | Qt 6.2 |
公共函数
| QHashSeed(size_t data = 0) | |
| operator size_t() const |
静态公共成员
| QHashSeed | globalSeed() |
| void | resetRandomGlobalSeed() |
| void | setDeterministicGlobalSeed() |
详细说明
QHashSeed 类用于传递QHash 的种子。该类由QHash 内部使用,并提供三个静态成员函数,允许用户获取哈希值并重置它。
QHash 以及qHash() 函数实现了所谓的“加盐哈希”。其目的是让不同的应用程序以及同一应用程序的不同实例,对于相同的输入产生不同的哈希值,从而使外部观察者无法预测QHash 中元素的排序顺序。这提高了应用程序抵御试图将哈希表逼入退化模式的攻击的韧性。
大多数应用程序无需直接处理哈希种子,因为QHash 会在需要时自动处理。不过,应用程序可能希望像QHash 那样将其用于自身目的:作为应用程序全局的随机值(但请同时参阅QRandomGenerator )。 请注意,如果在应用程序运行期间调用了resetRandomGlobalSeed() 函数,全局哈希种子可能会发生变化。使用全局哈希的用户需要保存当前使用的值,而不能指望再次获取该值。
该类还实现了将哈希种子设置为确定性值的功能,qHash() 函数会将此解释为:它们也应对其数据使用固定的哈希函数。 此功能仅供在调试应用程序时使用。通过将环境变量 `QT_HASH_SEED ` 设置为零,也可以控制此行为(任何其他值均被忽略)。
另请参阅 QHash 和QRandomGenerator 。
成员函数文档
[constexpr] QHashSeed::QHashSeed(size_t data = 0)
使用data 作为种子,构建一个新的QHashSeed对象。
[static noexcept] QHashSeed QHashSeed::globalSeed()
返回当前全局QHash 的种子值。如果已调用setDeterministicGlobalSeed()函数,或者环境变量QT_HASH_SEED 被设置为0,则该函数返回的值为0。
注意:此函数是线程安全的。
[static] void QHashSeed::resetRandomGlobalSeed()
将 Qt 的哈希种子重置为一个新的随机值。调用此函数并非必要,但对于运行时间较长的应用程序,在经过较长时间后(此时其哈希信息可能已被潜在攻击者获取),可能需要执行此操作。
如果环境变量QT_HASH_SEED 设置为零,调用此函数将不产生任何效果。
Qt XML 在应用程序执行期间绝不会调用此函数,但除非将QT_HASH_SEED 变量设置为 0,否则globalSeed() 返回的哈希种子将是一个随机值,就好像此函数已被调用一样。
注意:此函数是线程安全的。
[static] void QHashSeed::setDeterministicGlobalSeed()
将 Qt 的哈希种子强制设为一个确定性值(零),并要求 `qHash()` 函数使用预先确定的哈希函数。此模式仅适用于调试,不应在生产代码中使用。
可通过调用resetRandomGlobalSeed()恢复常规操作。
注意:此函数是线程安全的。
[constexpr noexcept] QHashSeed::operator size_t() const
将返回的哈希种子转换为size_t 。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.