当前位置: 首页 > 知识库问答 >
问题:

。使用SHA256的. Net核心字符串哈希

谭晓博
2023-03-14

你好,所以社区我需要一些哈希专业知识:

我面临着比较两个对象列表的问题。列表的一个实例在.Net Core 2.0应用程序中,另一个在.Net 4.5.2应用程序中。

为了比较两个列表(确保它们在两个应用程序中是相同的),我想计算列表的哈希值,并在应用程序之间交换。为了计算列表的哈希值,我使用了这个答案中描述的方法。

为此,您需要列表中对象的哈希码,这就是我的问题所在:似乎众所周知的事实(1).Net core对字符串使用随机哈希码行为。要计算对象的哈希码,我需要包含字符串的哈希代码。

引出我的问题:使用SHA256计算一个字符串的散列值是个好主意吗?

我想使用它的原因:

  • 相同的输出大小(256位可以解释Int32)
  • SHA应该总是产生相同的输出(也适用于未来的. net/core版本)
  • 在应用程序之间共享比自定义实现更容易

是否有更好(更有效,更容易,更少碰撞)的替代方案?

共有1个答案

顾赞
2023-03-14

由于计算成本很高,使用哈希码的好处很低,可能没有必要使用加密哈希函数。一些只需要加法和乘法的基本哈希函数就足够了——请参阅覆盖System.Object.GetHashCode?的最佳算法是什么,例如数组/多个字段的良好哈希函数(类似于您在问题中链接的哈希函数)。对加密哈希函数的要求比将值放入哈希表或基本不等式检查通常需要的要强得多。

笔记:

>

  • SHA256为您提供了比常规GetHashCode(256比32)所需位数多8倍的位数。为了获得有意义的好处,您需要更新其余代码以计算256位哈希代码
  • SHA256(和其他密码算法)适用于字节数组——您必须将字符串转换为字节数组来计算散列,从而使其速度更慢。此时,您可以考虑将整个数据结构序列化为字节数组,并一次性计算SHA256
  • 除非您有有限的值集,所以您可以找到完美的哈希函数,否则您必须始终处理冲突的可能性:相等的哈希代码并不意味着相等的值。较长的哈希值将减少碰撞生日问题的可能性,所以您可能需要根据需要调整哈希代码长度
  • 如果您需要公开散列SHA256是一种简单的描述方法……但您需要非常小心地解释字符串如何转换为字节数组(编码是一个重要部分),以及在此之前是否需要任何规范化(包括String.Normalize)。

    考虑一些其他的机制——可能是数据的版本控制或不可变的数据结构来实现您所寻找的任何东西。

  •  类似资料:
    • .NET核心和ASP.NET核心到底有什么区别?

    • 我将我的. net webapi移植到. net core webapi。在我使用的旧代码中 为此,我使用了库 但在移植到.net core之后,我面临的问题是: 对此的解决方案是什么?

    • 问题内容: 有人可以给我展示一个如何使用Go 1 生成一个字符串的SHA哈希的工作示例吗? 文档页面缺少示例,我在Google上找不到任何有效的代码。 问题答案: 一个例子 : 在此示例中,我从字节数组进行着色。您可以使用以下方法获取字节数组 当然,如果不需要,您不需要在base64中进行编码:您可以使用Sum函数返回的原始字节数组。 下面的评论似乎有些混乱。因此,让我们为下一个用户阐明有关转换为

    • 我读过关于.NET标准和.NET核心之间的区别,但我真的不知道区别是什么,也不知道什么时候选择.NET标准库项目,什么时候选择.NET核心库项目。

    • 问题内容: 我有一个要哈希的字符串。在node.js中生成哈希的最简单方法是什么? 哈希用于版本控制,而非安全性。 问题答案: 看看crypto.createHash(algorithm)

    • 我正在尝试使用iTextSharpLGPLv2将HTML文档转换为PDF。核心nuget库。 我面临的问题是,HTMLWorker不再支持iTextSharper。 下面是我的代码。 任何替代iTextSharper的产品。净核心?或者用其他方法来解决这个问题?