对于算术运算,160位哈希中最重要的字节是什么?

本文关键字:最重要的 字节 是什么 哈希中 160位 算术运算 | 更新日期: 2023-09-27 17:49:33

有人能帮我理解160位(SHA-1)哈希的最重要字节是什么吗?

我有一个c#代码调用密码学库从数据流计算哈希码。在结果中,我得到一个20字节的c#数组。然后我从另一个数据流中计算另一个哈希码,然后我需要将哈希码按升序排列。

现在,我正试图理解如何正确地比较它们。显然,我需要从另一个减去一个,然后检查结果是负的,正的还是零。从技术上讲,我有2个20字节的数组,如果我们从内存的角度来看,它在开始时具有最低有效字节(较低的内存地址),在结束时具有最高有效字节(较高的内存地址)。另一方面,从人类阅读的角度来看,最重要的字节在开头,最不重要的字节在末尾,如果我没有弄错的话,这个顺序用于比较guid。当然,如果我们用一种或另一种方法,它会给我们不同的顺序。哪种方法被认为是比较哈希码的正确方法或传统方法?这在我们的案例中尤其重要,因为我们正在考虑实现一个分布式哈希表,它应该与现有的哈希表兼容。

对于算术运算,160位哈希中最重要的字节是什么?

您应该将初始散列视为字节,而不是数字。如果您试图对它们进行索引查找排序,请使用最容易实现的排序-这里没有通用的"正确"或"常规",真的。

如果你有一些特定的哈希表,你想要"兼容"(甚至不确定这意味着什么),你应该看看哈希表排序的方法,假设它是相关的。如果您需要兼容多个表,您可能会发现需要对不同的表使用不同的排序。

考虑到这些评论,您正在尝试使用Kademlia,它基于此文档将哈希值视为大端数字:

Kademlia遵循Pastry将键(包括nodeid)解释为双端数字。这意味着在字节数组中表示键的低阶字节是最重要的字节,所以如果两个键靠得很近,那么距离数组中的低阶字节将为零。

这只是对字节的任意解释-只要每个人都使用相同的解释,它就会工作…但是,如果每个人都决定把它们解释为小端数字,它也会工作得很好。

您可以使用SequenceEqual来比较字节数组,查看以下链接了解详细信息:

如何比较两个字节数组

比较。net中两个字节数组