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

news2024/10/7 13:15:59

在 .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.coloradmin.cn/o/1916981.html

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

相关文章

LabVIEW远程实验数据采集系统

随着科学研究的不断发展&#xff0c;实验室对远程数据采集和监控的需求越来越高。传统的数据采集方式往往需要实验人员亲临现场&#xff0c;费时费力&#xff0c;且数据实时性较差。为了解决这些问题&#xff0c;基于LabVIEW开发了一套远程实验数据采集系统&#xff0c;实现对实…

网络建设与运维23国赛网络运维正式赛题解析

竞赛环境请看主页&#xff01; 23国赛网络运维 任务描述&#xff1a;某集团公司在更新设备后&#xff0c;路由之间无法正常通信&#xff0c;请修 复网络达到正常通信。 &#xff08;1&#xff09; 请在server1“管理员”下拉菜单中选择“镜像”选项卡&#xff0c;点 击 “创…

就业平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;企业管理&#xff0c;企业类型管理&#xff0c;留言板管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;招聘信息&#xff0c;简历&#xff0c;我的…

centos安装数据库同步工具sqoop并导入数据,导出数据,添加定时任务

目录 1.安装jdk 1.1上传jdk安装包到/opt目录下并解压 1.2解压 1.3配置环境变量 2.安装hadoop 2.1.下载hadoop 2.2.解压hadoop 2.3配置环境变量 3.安装sqoop 3.1下载 3.2解压 3.3下载依赖包并复制到指定位置 3.3.1下载commons-lang-2.6-bin.tar.gz 3.3.2将mysql-c…

2024Q2全球PC市场:联想增3.7%、苹果增20.8%

7月9日&#xff0c;IDC发布最新PC市场报告&#xff0c;称2024年第2季度全球PC出货量 6490 万台&#xff0c;同比增长3.0%&#xff0c;尽管整体市场得益于与2023年较低数据的有利比较&#xff0c;但中国的PC市场仍处于疲软态势。除中国外&#xff0c;全球出货量同比增长超过5%。…

ubuntu部署minio集群

minio集群介绍 官方文档&#xff1a;https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-multi-node-multi-drive.html 本方案采用在多节点多驱动器 (MNMD) 或“分布式”配置部署 MinIO。 MNMD 部署提供企业级性能、可用​​性和可扩展性&#…

【每日一练】python面对对象的基本概念和用法(附实例)

面向对象编程&#xff08;OOP&#xff09;是一种程序设计方法&#xff0c;其基本概念包括对象、类、继承和封装。 对象&#xff1a;对象是系统中的基本单位&#xff0c;用于描述客观事物。每个对象包含一组属性和对这些属性进行操作的方法。对象是类的一个实例&#xff0c;具有…

10-《木棉》

木 棉 木棉又名红棉、英雄树、攀枝花、斑芝棉、斑芝树、攀枝&#xff0c;属木棉科&#xff0c;落叶大乔木&#xff0c;原产印度。木棉是一种在热带及亚热带地区生长的落叶大乔木&#xff0c;高10&#xff0d;25米。树干基部密生瘤刺&#xff0c;以防止动物的侵入。木棉外观多变…

Dart笔记:Isolate及其通信机制

Dart笔记 多隔离及其通信机制 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/a…

【合并两个有序数组】

合并两个有序数组 一、题目二、普通解法三、双指针 一、题目 二、普通解法 先合并后排序 补充:js合并数组方法详见https://blog.csdn.net/ACCPluzhiqi/article/details/131702269?fromshareblogdetail js排序方法见http://t.csdnimg.cn/wVCOP 时间复杂度&#xff1a;O(mn)…

【DevOps】在云原生时代的角色与重要性探索

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是云原生 2、云原生的核心特性 3、什么是DevOps…

c++获取用户的输入并格式化

一行单个数据 string str; cin>>str;一行固定多个且空格隔开 int n, m; cin >> n >> m;在输入时&#xff0c;会自动做格式装换。 一行不固定多个且空格隔开 #include <sstream> #include <string>string str; getline(cin, str); stringstr…

FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流

SRT Streamer是一个安卓手机端的开源SRT协议直播推流框架&#xff0c;可用于RTMP直播和SRT直播。SRT Streamer支持的视频编码包括H264、H265等等&#xff0c;支持的音频编码包括AAC、OPUS等等&#xff0c;可谓功能强大的APP直播框架。 相比之下&#xff0c;另一款APP直播框架RT…

【系统架构设计师】九、软件工程(软件开发生命周期|McCabe度量法|系统转换|系统维护|净室软件工程|基于构件的软件工程)

目录 九、软件开发生命周期和工具 十、McCabe度量法 十一、系统转换 11.1 遗留系统 11.2 系统转换 11.3 系统维护 十二、净室软件工程 十三、基于构件的软件工程 13.1 构件特征 13.2 构件模型要素 13.3 CBSE过程 13.4 构件组装 相关推荐 历年真题练习 九、软件开…

Django项目创建的基本准备工作【4】

【 一 】软件开发模式 官话下面 人话 瀑布开发就是将什东西都定义好了在进行开发对吧 敏捷就是进行模块化一样 分批进行 规定一个时间段完成什么样的功能。 总结来说&#xff0c;瀑布开发强调在项目开始之前进行详细的计划和准备&#xff0c;并按照预定的顺序逐步进行&#x…

Elasticseach学习

概念 是一个开源的分布式搜索引擎&#xff0c;可以应用于搜索、日志监控等 倒排索引 正向索引&#xff1a;基于文档id创建索引。查询词条时必须先找到文档&#xff0c;而后判断是否包含词条 倒排索引&#xff1a;对文档内容分词&#xff0c;对词条创建索引&#xff0c;并记录…

前端面试题44(JavaScript几种排序的变种或高级应用)

1. 快速排序的变种 三轴快排 (Three-Way QuickSort)&#xff1a;处理大量重复元素时更为高效&#xff0c;通过维护三个区域来避免重复元素的重复比较和交换。平衡快排 (Balanced QuickSort)&#xff1a;通过随机选取或使用中位数作为枢轴&#xff0c;以减少最坏情况下的性能退…

重命名文件的方法有哪些?重命名文件的工具有哪些?

在日常的计算机使用过程中&#xff0c;重命名文件是一项常见但至关重要的任务。无论是为了更好地组织文件、修复命名错误&#xff0c;还是简化文件管理流程&#xff0c;掌握正确的重命名方法和工具都能显著提升效率。 本文将探讨多种重命名文件的方法&#xff0c;同时介绍几款高…

传言称 iPhone 16 Pro 将支持 40W 快速充电和 20W MagSafe

目前&#xff0c;iPhone 15 和 iPhone 15 Pro 机型使用合适的 USB-C 电源适配器可实现高达 27W 的峰值充电速度&#xff0c;而 Apple 和授权第三方的官方 MagSafe 充电器可以高达 15W 的功率为 iPhone 15 机型进行无线充电。所有四款 iPhone 15 机型均可使用 20W 或更高功率的电…

ArduPilot开源飞控之AP_Mount_Siyi

ArduPilot开源飞控之AP_Mount_Siyi 1. 源由2. 框架设计2.1 类和继承2.2 公共方法2.3 保护方法2.4 私有成员和方法2.5 解析状态2.6 重要成员变量 3. 重要方法3.1 AP_Mount_Siyi::init3.2 AP_Mount_Siyi::update3.3 AP_Mount_Siyi::read_incoming_packets3.4 AP_Mount_Siyi::proc…