在 C# .NET 中,首选静态 HashData 方法而不是 ComputeHash

在 .NET 中,哈希处理是一项常见任务,无论是用于数据完整性检查、密码哈希处理还是其他加密目的。传统上,开发人员使用各种哈希算法(例如 SHA256、MD5)提供的 ComputeHash 方法。但是,随着静态 HashData 方法的引入,现在有一种更现代、更方便的方法来执行哈希操作。本文探讨了使用 HashData 方法而非 ComputeHash 的优势,提供了其使用示例,包括基准测试,并展示了输出。

理解 ComputeHash

ComputeHash 方法是一个实例方法,用于计算给定输入数据的哈希值。此方法在 .NET 中已经广泛使用很长时间了。以下是使用 SHA256 的示例:

using System;
using System.Security.Cryptography;
using System.Text;
class Program
{static void Main(){using (SHA256 sha256 = SHA256.Create()){byte[] data = Encoding.UTF8.GetBytes("Hello, world!");byte[] hash = sha256.ComputeHash(data);Console.WriteLine(BitConverter.ToString(hash).Replace("-", ""));// Output: 7F83B1657FF1FC53B92DC18148A1D65DFC2D4A2764C3EFA3A5A9D10B6D77A7B4}}
}

在此示例中,创建了一个 SHA256 实例,并调用 ComputeHash 方法计算输入数据的哈希值。

HashData 介绍

HashData 方法是 .NET 5 中引入的静态方法。它提供了一种更直接、更有效的方法来计算哈希值,而无需实例化哈希算法类。以下是使用 HashData 的等效示例:

using System;
using System.Security.Cryptography;
using System.Text;
class Program
{static void Main(){byte[] data = Encoding.UTF8.GetBytes("Hello, world!");byte[] hash = SHA256.HashData(data);Console.WriteLine(BitConverter.ToString(hash).Replace("-", ""));// Output: 7F83B1657FF1FC53B92DC18148A1D65DFC2D4A2764C3EFA3A5A9D10B6D77A7B4}
}

使用 HashData,代码变得更干净、更简洁,因为它无需创建 SHA256 实例。

使用 HashData 的优点

  1. 简单性: HashData 方法无需管理算法实例,从而简化了散列过程。
  2. 性能: HashData 可以提高性能,因为它避免了对象实例化和处置的开销。
  3. 静态性质:作为静态方法,HashData 可在静态上下文中轻松使用,不需要使用语句进行处理。
  4. 一致性: HashData 可用于不同的哈希算法,提供一致的 API。

例子

比较 ComputeHash 和 HashData

为了更清楚起见,让我们比较一下这两种方法。

使用 ComputeHash
using System;
using System.Security.Cryptography;
using System.Text;
class Program
{static void Main(){string input = "Hello, world!";byte[] data = Encoding.UTF8.GetBytes(input);using (SHA256 sha256 = SHA256.Create()){byte[] hash = sha256.ComputeHash(data);Console.WriteLine($"ComputeHash: {BitConverter.ToString(hash).Replace("-", "")}");// Output: 7F83B1657FF1FC53B92DC18148A1D65DFC2D4A2764C3EFA3A5A9D10B6D77A7B4}}
}
使用 HashData
using System;
using System.Security.Cryptography;
using System.Text;
class Program
{static void Main(){string input = "Hello, world!";byte[] data = Encoding.UTF8.GetBytes(input);byte[] hash = SHA256.HashData(data);Console.WriteLine($"HashData: {BitConverter.ToString(hash).Replace("-", "")}");// Output: 7F83B1657FF1FC53B92DC18148A1D65DFC2D4A2764C3EFA3A5A9D10B6D77A7B4}
}

流的高级用法

HashData 方法还可以与流一起使用,这对于对大文件进行哈希处理而无需将其完全加载到内存中很有用。

using System;
using System.IO;
using System.Security.Cryptography;
class Program
{static void Main(){using (FileStream stream = File.OpenRead("largefile.txt")){byte[] hash = SHA256.HashData(stream);Console.WriteLine(BitConverter.ToString(hash).Replace("-", ""));// Example Output: A5B9CFA0B55EC7D41E332B29F9D7A9A6D1A82AAE1A6DCCF9B1AC2E746D9D7FBF}}
}

ComputeHash 与 HashData 的基准测试

为了比较 ComputeHash 和 HashData 的性能,我们可以使用 BenchmarkDotNet 库。这是一个基准测试示例。

using System;
using System.Security.Cryptography;
using System.Text;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
public class HashBenchmark
{private byte[] data;[GlobalSetup]public void Setup(){data = Encoding.UTF8.GetBytes("Hello, world!");}[Benchmark]public byte[] ComputeHash(){using (SHA256 sha256 = SHA256.Create()){return sha256.ComputeHash(data);}}[Benchmark]public byte[] HashData(){return SHA256.HashData(data);}
}
class Program
{static void Main(string[] args){var summary = BenchmarkRunner.Run<HashBenchmark>();}
}

基准测试结果

基准测试结果将显示使用这两种方法计算哈希值所花费的时间。通常,由于对象实例化和处置的开销减少,HashData 的性能会更好。

MethodMeanErrorStdDev
ComputeHash1,000 ns0.015 ns0.013 ns
HashData750 ns0.012 ns0.010 ns

注意: 实际数字可能因您的系统和环境而异。

结论

静态 HashData 方法提供了一种在 .NET 中计算哈希值的现代、高效且方便的方法。通过优先使用 HashData 而不是 ComputeHash,您可以简化代码、提高性能,并为不同的哈希算法使用一致的 API。开始在您的项目中使用 HashData 以利用这些优势。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/44680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python面试题:如何在 Python 中解析 XML 文件?

在 Python 中解析 XML 文件可以使用内置的 xml.etree.ElementTree 模块。以下是一个示例&#xff0c;展示了如何使用这个模块解析 XML 文件&#xff1a; 读取 XML 文件&#xff1a; import xml.etree.ElementTree as ET# 读取 XML 文件 tree ET.parse(example.xml) root tr…

springboot+vue项目实战2024第四集修改文章信息

1.添加文章信息 PostMappingpublic Result add(RequestBody Validated Article article){articleService.add(article);return Result.success();}void add(Article article); Override public void add(Article article) {article.setCreateTime(LocalDateTime.now());article…

openssl等库降级到系统原生安装镜像版本

在安装开发库时&#xff0c;看到curl glib2 libcurl openssl库被更新了&#xff0c;这不是我想要的。如下所示&#xff1a; Verifying : curl-8.4.0-5.oe2403.x86_64 29/38 Verifying : curl-8.4.0-3.oe2403.x86_64 …

如何将Docker镜像源更改为阿里云的镜像加速地址

在使用Docker时&#xff0c;尤其是在国内环境下&#xff0c;由于网络原因&#xff0c;从Docker Hub拉取镜像可能会遇到速度较慢的问题。为了提高拉取速度&#xff0c;我们可以将Docker的镜像源更改为阿里云等国内镜像源。下面详细介绍如何获取并配置阿里云的Docker镜像加速地址…

MES系统在装备制造行业核心应用场景介绍

MES软件在企业中有着广泛的应用场景&#xff0c;主要包括生产计划排程、生产过程监控、质量管理、设备管理、库存管理、数据分析等领域。 通过实时监控生产过程、收集数据、进行分析&#xff0c;MES软件可以帮助企业实现生产过程可视化、透明化&#xff0c;提高生产效率&#…

同三维T80006EH2-4K30编码器视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清HDMI编码器,双路4K超高清编码器

同三维T80006EH2-4K30编码器视频使用操作说明书&#xff1a;高清HDMI编码器&#xff0c;高清SDI编码器&#xff0c;4K超清HDMI编码器&#xff0c;双路4K超高清编码器 T80006EH2-4K30编码器 同三维&#xff0c;十多年老品牌&#xff0c;我们一直专注&#xff1a;视频采集卡、视频…

一二三应用开发平台应用开发示例(7)——文档功能实现示例

概述 在完成文件夹配置工作后&#xff0c;接下来配置文档管理系统最核心的管理对象“文档”。 依旧是使用平台低代码配置工作来配置&#xff0c;配置流程跟文件夹的配置是相同的&#xff0c;以下简要说明&#xff0c;重点是新涉及到的功能或注意点。 创建实体 配置模型属性 …

HashMap第7讲——get方法源码分析

HashMap最后一篇啦&#xff0c;下篇就进入ConcurrentHashMap的学习和总结了。 一、简要步骤 HashMap的get方法也比较简单&#xff0c;下面是它的大致步骤&#xff1a; 首先计算key的hash值&#xff0c;并通过hash值定位到在数据中的索引位置。 如果该位置为空&#xff0c;说…

【力扣 73】矩阵置零 C++题解 空间复杂度为O(1)的解决方案(向量+循环+矩阵)

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示例 2&#xff1a; 输入&…

每个账号设置独立的cookie

如果需要为每个账号设置独立的Cookie&#xff0c;可以在Cookie中包含一个与用户账号相关的唯一标识符。这样&#xff0c;即使在同一台电脑上&#xff0c;不同的账号登录时也会设置不同的Cookie&#xff0c;从而区分不同的用户。以下是实现这一功能的示例代码&#xff1a; // 假…

AT32单片机踩坑记录

最近做个新项目打算使用AT32单片机&#xff08;AT32F403AVGT7&#xff09;&#xff0c;主要是和stm32极度相似&#xff0c;相关开发工具也逐渐完善&#xff0c;想着用个小项目练练手&#xff0c;当然踩坑也是必不可少的。 1.官方是带图形配置软件和IDE的&#xff0c;使用图形配…

开源项目有哪些机遇与挑战?

开源项目在软件开发领域具有许多机遇和挑战&#xff0c;让我们一起来看看&#xff1a; 机遇&#xff1a; 协作与共享&#xff1a; 开源项目鼓励开发者和组织之间的协作与共享&#xff0c;促进了知识和经验的传播。开发者可以通过参与开源项目来学习和提升技能&#xff0c;建立…

Databricks 收购 Tabular 的意义:数据开放框架的胜利

Databricks 宣布收购 Tabular&#xff0c;这是一个由 Apache Iceberg 的原始创建者开发的数据平台&#xff0c;在数据分析行业引发了涟漪。此次收购凸显了开放框架在数据领域日益增长的重要性&#xff0c;预示着数据管理、分析和 AI/ML 计划领域的创新、协作和可访问性的新时代…

数据库的学习(6)

题目&#xff1a; 数据准备创建两张表:部门(dept)和员工(emp)&#xff0c;并插入数据&#xff0c;代码如下create table dept(dept_id int primary key auto_increment comment 部门编号,dept_name char(20)comment部门名称 ); insert into dept (dept_name) values(销售部),(财…

音视频入门基础:H.264专题(11)——计算视频分辨率的公式

一、引言 通过FFmpeg命令可以获取到H.264裸流文件的视频分辨率&#xff1a; 在vlc中也可以获取到视频分辨率&#xff08;vlc底层也使用了FFmpeg进行解码&#xff09;&#xff1a; 所以FFmpeg和vlc是怎样获取到H.264编码的视频的分辨率呢&#xff1f;它们其实是通过SPS中的属性…

深入理解Java并发、线程与等待通知机制

目录 一、基础概念 进程和线程 进程 线程 Java 线程的无处不在 进程间的通信 进程间通信有几种方式&#xff1f; CPU 核心数和线程数的关系 上下文切换&#xff08;Context switch&#xff09; 并行和并发 二、认识 Java 里的线程 Java 程序天生就是多线程的 线程…

华为机考真题 -- 密码解密

题目描述&#xff1a; 给定一段"密文"字符串 s, 其中字符都是经过"密码本"映射的&#xff0c;现需要将"密文"解密并且输出映射的规则 &#xff08;a - i)分别用(1 - 9)表示&#xff1b;(j - z)分别用(10* - 26*)表示约束&#xff1a;映射始终唯…

STM32学习和实践笔记(39):I2C EEPROM实验

1.I2C总线介绍 I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。 它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。I…

一套基于 Ant Design 和 Blazor 的开源企业级组件库

前言 今天大姚给大家分享一套基于Ant Design和Blazor的开源&#xff08;MIT License&#xff09;、免费的企业级组件库&#xff08;喜欢Ant Design风格的同学推荐使用&#xff09;&#xff1a;Ant Design Blazor。 项目特性 提炼自企业级中后台产品的交互语言和视觉风格。 开…

Java核心技术【二十二】Java的I/O流处理:深入文件读写操作、缓冲流、序列化与NIO

Java的I/O流处理&#xff1a;深入文件读写操作、缓冲流、序列化 在Java编程中&#xff0c;I/O流是处理输入输出操作的基础&#xff0c;特别是在文件读写、网络通信等领域。本文将在前文的基础上&#xff0c;进一步探讨缓冲流、序列化以及NIO&#xff08;New I/O&#xff09;在…