.net 哈希

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace HashTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string plainText = ".Net5 框架";
            // 因为所有哈希函数的输入类型都是 Byte[],所以必须先将源数据转换为字节数组后再计算哈希值。
            byte[] plainByte = ASCIIEncoding.ASCII.GetBytes(plainText);
            Console.WriteLine("明文字符串:" + plainText);
            Console.WriteLine("======================================================");

            Console.ForegroundColor = ConsoleColor.Red;
            MD5Hash(plainByte);
            Console.ForegroundColor = ConsoleColor.Green;
            SHA1Hash(plainByte);
            Console.ForegroundColor = ConsoleColor.DarkYellow;
            SHA512Hash(plainByte);
            Console.ReadKey();
        }

        /// <summary>
        /// MD5哈希计算
        /// </summary>
        static void MD5Hash(byte[] plainByte)
        {
            // MD5本身是一个抽象类
            MD5 md5 = MD5.Create();   // 默认实现类:Create("System.Security.Cryptography.MD5");
            byte[] hashByte = md5.ComputeHash(plainByte);
            Console.WriteLine("1.0:MD5默认实现类对明文字符串进行哈希计算后的结果:");
            Console.WriteLine(ByteArrayToString(hashByte));
            Console.WriteLine("======================================================");

            // MD5的两个派生类:System.Security.Cryptography.MD5Cng 和 System.Security.Cryptography.MD5CryptoServiceProvider
            MD5 md5Cng = MD5.Create("System.Security.Cryptography.MD5Cng");
            byte[] cngHashByte = md5Cng.ComputeHash(plainByte);
            Console.WriteLine("1.1:设置MD5的静态方法Create的参数为System.Security.Cryptography.MD5Cng,哈希结果为:");
            Console.WriteLine(ByteArrayToString(cngHashByte));
            Console.WriteLine("======================================================");

            MD5 md5CryptoServiceProvider = MD5.Create("System.Security.Cryptography.MD5CryptoServiceProvider");
            byte[] providerHashByte = md5CryptoServiceProvider.ComputeHash(plainByte);
            Console.WriteLine("1.2:设置MD5的静态方法Create的参数为System.Security.Cryptography.MD5CryptoServiceProvider,哈希结果为:");
            Console.WriteLine(ByteArrayToString(providerHashByte));
            Console.WriteLine("======================================================");

            // 直接使用派生类进行哈希
            MD5Cng md5Cng2 = new MD5Cng();
            byte[] cngHashByte2 = md5Cng.ComputeHash(plainByte);
            Console.WriteLine("2.0:直接使用MD5的派生类MD5Cng进行哈希,哈希结果为:");
            Console.WriteLine(ByteArrayToString(cngHashByte2));
            Console.WriteLine("======================================================");

            MD5CryptoServiceProvider md5CryptoServiceProvider2 = new MD5CryptoServiceProvider();
            byte[] providerHashByte2 = md5Cng.ComputeHash(plainByte);
            Console.WriteLine("2.1:直接使用MD5的派生类MD5CryptoServiceProvider进行哈希,哈希结果为:");
            Console.WriteLine(ByteArrayToString(providerHashByte2));
            Console.WriteLine("======================================================");
        }

        /// <summary>
        /// SHA1哈希
        /// </summary>
        /// <param name="plainByte"></param>
        static void SHA1Hash(byte[] plainByte)
        {
            // SHA1本身是一个抽象类
            SHA1 sha1 = SHA1.Create();   // 默认实现类:Create("System.Security.Cryptography.SHA1");
            byte[] hashByte = sha1.ComputeHash(plainByte);
            Console.WriteLine("1.0:SHA1默认实现类对明文字符串进行哈希计算后的结果:");
            Console.WriteLine(ByteArrayToString(hashByte));
            Console.WriteLine("======================================================");

            // SHA1的两个派生类:System.Security.Cryptography.SHA1Cng 和 System.Security.Cryptography.SHA1CryptoServiceProvider
            SHA1 sha1Cng = SHA1.Create("System.Security.Cryptography.SHA1Cng");
            byte[] cngHashByte = sha1Cng.ComputeHash(plainByte);
            Console.WriteLine("1.1:设置SHA1的静态方法Create的参数为System.Security.Cryptography.SHA1Cng,哈希结果为:");
            Console.WriteLine(ByteArrayToString(cngHashByte));
            Console.WriteLine("======================================================");

            SHA1 sha1CryptoServiceProvider = SHA1.Create("System.Security.Cryptography.SHA1CryptoServiceProvider");
            byte[] providerHashByte = sha1CryptoServiceProvider.ComputeHash(plainByte);
            Console.WriteLine("1.2:设置SHA1的静态方法Create的参数为System.Security.Cryptography.SHA1CryptoServiceProvider,哈希结果为:");
            Console.WriteLine(ByteArrayToString(providerHashByte));
            Console.WriteLine("======================================================");

            // 直接使用派生类进行哈希
            SHA1Cng sha1Cng2 = new SHA1Cng();
            byte[] cngHashByte2 = sha1Cng2.ComputeHash(plainByte);
            Console.WriteLine("2.0:直接使用SHA1的派生类SHA1Cng进行哈希,哈希结果为:");
            Console.WriteLine(ByteArrayToString(cngHashByte2));
            Console.WriteLine("======================================================");

            SHA1CryptoServiceProvider sha1CryptoServiceProvider2 = new SHA1CryptoServiceProvider();
            byte[] providerHashByte2 = sha1CryptoServiceProvider2.ComputeHash(plainByte);
            Console.WriteLine("2.1:直接使用SHA1的派生类SHA1CryptoServiceProvider进行哈希,哈希结果为:");
            Console.WriteLine(ByteArrayToString(providerHashByte2));
            Console.WriteLine("======================================================");
        }

        static void SHA256Hash(byte[] plainByte)
        {

        }

        static void SHA384Hash(byte[] plainByte)
        {

        }

        static void SHA512Hash(byte[] plainByte)
        {
            // 直接使用派生类进行哈希
            SHA512Cng sha512Cng2 = new SHA512Cng();
            byte[] cngHashByte2 = sha512Cng2.ComputeHash(plainByte);
            Console.WriteLine("2.0:直接使用SHA512的派生类SHA512Cng进行哈希,哈希结果为:");
            Console.WriteLine(ByteArrayToString(cngHashByte2));
            Console.WriteLine("======================================================");

            SHA512CryptoServiceProvider sha512CryptoServiceProvider2 = new SHA512CryptoServiceProvider();
            byte[] providerHashByte2 = sha512CryptoServiceProvider2.ComputeHash(plainByte);
            Console.WriteLine("2.1:直接使用SHA512的派生类SHA512CryptoServiceProvider进行哈希,哈希结果为:");
            Console.WriteLine(ByteArrayToString(providerHashByte2));
            Console.WriteLine("======================================================");

            SHA512Managed sha512Managed = new SHA512Managed();
            byte[] sha512ManagedHashByte = sha512Managed.ComputeHash(plainByte);
            Console.WriteLine("2.2:直接使用SHA512的派生类SHA512Managed进行哈希,哈希结果为:");
            Console.WriteLine(ByteArrayToString(sha512ManagedHashByte));
            Console.WriteLine("======================================================");
        }

        /// <summary>
        /// 字节数组转化成16进制字符串
        /// </summary>
        /// <param name="arrInput"></param>
        /// <returns></returns>
        static string ByteArrayToString(byte[] arrInput)
        {
            int i;
            StringBuilder sOutput = new StringBuilder(arrInput.Length);
            for (i = 0; i < arrInput.Length - 1; i++)
            {
                sOutput.Append(arrInput[i].ToString("X2"));
            }
            return sOutput.ToString();
        }
    }
}
时间: 2024-11-03 22:28:35

.net 哈希的相关文章

NYOJ 2356: 哈希计划【模拟】

题目描述 众所周知,LLM的算法之所以菜,就是因为成天打游戏,最近LLM突然想玩<金庸群侠传X>,结果进去后各种被虐,LLM就开始研究这个游戏的代码,顺便还学会了一点点点点lua语言,然后就开始了伟大的改游戏代码之旅,然后LLM发现自己too young了,这个游戏把所有的文本都进行了哈希,如果自己改了代码或者剧情文本的话它哈希出来的值就会和原来的哈希值不一样......然后游戏就会打不开.....,现在LLM发现了文本的哈希函数,要求你写个程序,功能为: 输入一段字符串,输出一个哈希值 为了

7.哈希

哈希(Hash)又称散列,它是一个很常见的算法.在Java的HashMap数据结构中主要就利用了哈希.哈希算法包括了哈希函数和哈希表两部分.我们数组的特性可以知道,可以通过下标快速(O(1))的定位元素,同理在哈希表中我们可以通过键(哈希值)快速的定位某个值,这个哈希值的计算就是通过哈希函数(hash(key) = address )计算得出的.通过哈希值即能定位元素[address] = value,原理同数组类似. 最好的哈希函数当然是每个key值都能计算出唯一的哈希值,但往往可能存在不同的

哈希表

哈希表支持的一种最有效的检索方法:散列. 由于计算哈希值和在数组中进行索引都只消耗固定时间,因此哈希表的最大亮点在于他是一种运行时间在常量级的检索方法. 哈希表主要有两种: 1.链式哈希表:将数据存储在桶中的哈希表,每个桶里面都是一个链表,且链表的容量随着冲突的增大而增大.(换句话说就是如果有冲突,会在桶中的链表加上一个存储的值) 2.开地址哈希表:将数据存在表本身,而不是在桶中,他通过各种探查方法来避免冲突. 解决冲突: 不管在以上那种哈希表中,我们的目标是尽可能均匀的分配表中的元素.所以我们

Aizu 2784 Similarity of Subtrees(树哈希)

Similarity of Subtrees Define the depth of a node in a rooted tree by applying the following rules recursively: The depth of a root node is 0. The depths of child nodes whose parents are with depth d are d+1 . Let S(T,d) be the number of nodes of T w

8. 蛤蟆的数据结构进阶八哈希表相关概念

8. 蛤蟆的数据结构进阶八哈希表相关概念 本篇名言:"作家当然必须挣钱才能生活,写作,但是他决不应该为了挣钱而生活,写作.--马克思" 前些笔记我们学习了二叉树相关.现在我们来看下哈希表.这篇先来看下哈希表的相关概念 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47347273 1.  哈希表的概念 哈希表(HashTable)也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构.它通过把关键

哈希(4) - 求两个链表的交集(intersection)以及并集(union)

给定两个链表,求它们的交集以及并集.用于输出的list中的元素顺序可不予考虑. 例子: 输入下面两个链表: list1: 10->15->4->20 list2: 8->4->2->10 输出链表: 交集list: 4->10 并集list: 2->8->20->4->15->10 方法1 (简单方法) 可以参考链表系列中的"链表操作 - 求两个链表的交集(intersection)以及并集(union)" 方法2

哈希(5) - 检测数组A[]中是否存在元素对其和为x

给定一个包括n个数值的数组A[]以及另一个数字x,判断数组中是否存在一对元素,它们的和等于x. 方法1 (使用排序) 算法: hasArrayTwoCandidates (A[], arrSize, sum) 1) 对数组进行递增排序 2) 初始化已排序数组中的两个索引值 (a) 将最左侧的数组位置0做为第一个索引left = 0 (b) 将最右侧的数组位置做为第二个索引right = arrSize-1 3) Loop while left < right. (a) if (A[left] +

哈希与加密(一)

声明:本文源自对哈希(Hash)与加密(Encrypt)的基本原理.区别及工程应用的学习整理 1.哈希与加密的区别 (1)哈希:将目标文本转换成具有相同长度.不可逆的杂凑字符串(或称消息摘要): (2)加密:将目标文本转换成具有不同长度.可逆的密文. 实际上,使用相同的hash算法,不论目标文本有多长,得到的结果长度固定:加密算法往往与目标文本的长度成正比. 2.哈希与加密的数学基础 (1)哈希算法:R=H(S)是多对一映射,多个不同的S可以通过哈希算法H得到相同的R.所以就不存在一个逆映射,使

hdu 1280 前m大的数 哈希

前m大的数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 10574    Accepted Submission(s): 3686 Problem Description 还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实小希已经找回了原来的那张数表,现在她想确认一下她的答案是否正确,但是整个的答案是很庞大的表,小

《我与希乐仑》第二弹

致徐敏: 如果你觉得我的这篇报道侵害了你和贵公司的权益,你可以上法院告我,但我说的都是事实,不怕你告,有事找我律师,谢谢! 我是希乐仑科技发展(上海)有限公司前员工,曾经为希乐仑立下汗马功劳.这公司从2014年2月份开始搞我,我去年的绩效是3.8/5.0,完全没有绩效问题.他们倒好,自从我查完我们公司某商业间谍之后,就给我穿小鞋,说我这个不好,那个拖延,这不是扯淡吗?公司在3月5日非法把我裁掉,而且直到现在还未支付我2月份工资,行吧,那我就不再沉默了,当我吃素的是吧!我现在把这件事情公之于众,望