算术运算的160位散列最重要的字节是什么?

时间:2015-05-18 17:42:05

标签: c# .net sha1 dht endianness

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

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

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

2 个答案:

答案 0 :(得分:7)

您应该将初始哈希视为字节而不是数字。如果您正在尝试为索引查找订购它们,请使用最简单的订单来实现 - 没有通用的目的"对"或"传统"在这里,真的。

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

鉴于这些评论,您正在尝试使用Kademlia,它基于this document将哈希视为大端数字:

  

Kademlia跟随Pastry将密钥(包括nodeID)解释为bigendian数字。这意味着表示键的字节数组中的低位字节是最重要的字节,因此如果两个键靠近在一起,则距离数组中的低位字节将为零。

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

答案 1 :(得分:1)

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

How to compare two arrays of bytes

Comparing two byte arrays in .NET