gpt4 book ai didi

c++ - 如何组合加密哈希?

转载 作者:行者123 更新时间:2023-11-30 02:39:32 26 4
gpt4 key购买 nike

最终目标:我想确定网格几何数据(和其他属性)的相等性

我选择的均值:通过比较他们的“top sha1 hash”。

但要制作顶级哈希,我需要组合来自散列自己数据的子例程的哈希。

长见识

问题:如何组合加密哈希,例如 sha1散列?
(我想要一个 boost::hash_combine<160>(h1, h2) )


NLEWTRM(N足够>To Re More)

在典型的过程编程中,你有一个“函数调用树”,相当于当你让编译器生成你的复制构造函数时发生的事情,当你从顶级类使用它时,你会得到一连串的调用,执行一个“深拷贝”。

所以,例如等效地,您可以(手动)编写一系列实现 size_t hash_value() 的可哈希类型(unordered 容器要求),并调用 hash_value()在任何类型上(通过 ADL)将导致“深度哈希”,因为您关心使用 boost::hash_combine在计算您的对象“本地最高哈希值”时。

我已经看到了如何 boost::hash_combine已实现,这对于 size_t 来说都很好.

这种组合对于从尊重封装的子程序中逐步计算哈希值是必要的。

我认为这个问题在某种程度上类似于“哈希树”或“哈希列表”,并且在对您无法处理的流进行哈希处理时,在“ block ”方面也已在 MD5 中得到解决(据我所知)一次存储所有数据。

请注意,在我的使用中,我不需要通过一次散列所有数据来生成的散列。因为我的实现(调用树)是稳定的,如果 2 个不同的网格对象具有相同的数据,它们将产生相同的散列,这是唯一重要的事情。 (因为我需要可比性,而不是官方主义或规范主义,我也不需要加密强度。但我需要合理的唯一性保证(比 size_t 提供的更多))

显而易见的方式 1:我现在考虑的解决方案是将子哈希本身用作消息,连接并重新哈希。 newsha = sha1(hash1 + hash2) 使用 + 消息(缓冲区)串联操作

第二种显而易见的方式:申请newsha = hash1 ^ hash2 ^模运算符

最佳答案

如果您“了解了 hash_combine 的实现方式”——为什么不对您的 160 位 SHA-1 值使用相同的通用逻辑呢?也就是说,而不是...

seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);

...添加一个 160 位常量,它有大约一半的位在一个很好的随机排列中。 (您需要实现 160 位算法或使用合适的库 - 例如 GMP)。考虑到您的 SHA1 哈希是高质量输入,没有特别需要大量移动 - 没有理由认为不太重要的位始终或多或少比其他位随机。如果您想按照 boost 的示例选择常量,请使用 2^160 而不是 2^32 重新应用逻辑:

phi = (1 + sqrt(5)) / 2
the_constant = 2^160 / phi
= 0x4F1B BCDC BFA5 3E0A F9CE 6030 2E76 E41A 0841 13B5

警告我没有分析这种方法对加密应用程序的影响。

关于c++ - 如何组合加密哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29767626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com