如何从整数生成 MD5 哈希值(32/64 个字符)

问题描述 投票:0回答:6

我已经谷歌搜索并检查过

如何从整数生成 MD5 哈希(32/64 个字符)?

我得到的是从字符串或字节数组生成 MD5 哈希字符串的示例。但就我而言,我需要获取整数的 MD5 哈希值。

我知道

GetHashCode()
方法可以获取整数的哈希码。但这个方法不适用于我的情况。

我是否需要将整数转换为字符串或字节数组才能获得预期的 MD5 哈希字符串?

c# .net hash integer md5
6个回答
4
投票

类似这样的:

  int source = 123;
  String hash;

  // Do not omit "using" - should be disposed
  using (var md5 = System.Security.Cryptography.MD5.Create()) 
  {
    hash = String.Concat(md5.ComputeHash(BitConverter
      .GetBytes(source))
      .Select(x => x.ToString("x2")));
  }

  // Test
  // d119fabe038bc5d0496051658fd205e6
  Console.Write(hash);

2
投票

如果你想知道“生命的意义”的 md5 哈希值是什么,你可以

int meaningOfLife = 42;
var result = CalculateMD5Hash(""+meaningOfLife);

这假设你可以

public string CalculateMD5Hash(string input)
{
    // step 1, calculate MD5 hash from input
    MD5 md5 = System.Security.Cryptography.MD5.Create();
    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
    byte[] hash = md5.ComputeHash(inputBytes);

    // step 2, convert byte array to hex string
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < hash.Length; i++)
    {
        sb.Append(hash[i].ToString("X2"));
    }
    return sb.ToString();
}

1
投票

首先您需要将整数转换为字节数组,然后您可以执行以下操作:

byte[] hashValue;
using (var md5 = MD5.Create())
{
    hashValue = md5.ComputeHash(BitConverter.GetBytes(5));
}

1
投票

谢谢大家。在参考了所有答案后,我在这里发布我的答案,其中包含用于从整数/字符串/字节数组生成“MD5哈希(32/64个字符)”的通用方法。可能对其他人有帮助。

using System;
using System.Security.Cryptography;
using System.Text;
using System.Linq;

namespace ConvertIntToHashCodeConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            int number = 100;
            Console.WriteLine(GetHashMD5(number.ToString()));
            Console.WriteLine(GetHashStringFromInteger(number));
            Console.Read();
        }
        /// <summary>
        /// Get the Hash Value for MD5 Hash(32 Characters) from an integer
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public static string GetHashStringFromInteger(int number)
        {
            string hash;
            using (var md5 = System.Security.Cryptography.MD5.Create())
            {
                hash = String.Concat(md5.ComputeHash(BitConverter
                  .GetBytes(number))
                  .Select(x => x.ToString("x2")));
            }
            return hash;
        }

        /// <summary>
        /// Get the Hash Value for sha256 Hash(64 Characters)
        /// </summary>
        /// <param name="data">The Input Data</param>
        /// <returns></returns>
        public static string GetHash256(string data)
        {
            string hashResult = string.Empty;

            if (data != null)
            {
                using (SHA256 sha256 = SHA256Managed.Create())
                {
                    byte[] dataBuffer = Encoding.UTF8.GetBytes(data);
                    byte[] dataBufferHashed = sha256.ComputeHash(dataBuffer);
                    hashResult = GetHashString(dataBufferHashed);
                }
            }
            return hashResult;
        }

        /// <summary>
        /// Get the Hash Value for MD5 Hash(32 Characters)
        /// </summary>
        /// <param name="data">The Input Data</param>
        /// <returns></returns>
        public static string GetHashMD5(string data)
        {
            string hashResult = string.Empty;
            if (data != null)
            {
                using (MD5 md5 = MD5.Create())
                {
                    byte[] dataBuffer = Encoding.UTF8.GetBytes(data);
                    byte[] dataBufferHashed = md5.ComputeHash(dataBuffer);
                    hashResult = GetHashString(dataBufferHashed);
                }
            }
            return hashResult;
        }
        /// <summary>
        /// Get the Encrypted Hash Data
        /// </summary>
        /// <param name="dataBufferHashed">Buffered Hash Data</param>
        /// <returns> Encrypted hash String </returns>
        private static string GetHashString(byte[] dataBufferHashed)
        {
            StringBuilder sb = new StringBuilder();
            foreach (byte b in dataBufferHashed)
            {
                sb.Append(b.ToString("X2"));
            }
            return sb.ToString();
        }
    }
}

随时欢迎修改/任何更好的解决方案。


0
投票

你可以试试这个,

int intValue = ; // your value
byte[] intBytes = BitConverter.GetBytes(intValue);
Array.Reverse(intBytes);
byte[] result = intBytes; // you are most probably working on a little-endian machine
byte[] hash = ((HashAlgorithm) CryptoConfig.CreateFromName("MD5")).ComputeHash(result);

// string representation (similar to UNIX format)
string encoded = BitConverter.ToString(hash)
   // without dashes
   .Replace("-", string.Empty)
   // make lowercase
   .ToLower();

0
投票

使用一些注重性能的功能(例如span和stackalloc)在散列过程中分配更少的内存!

用途:


var number = 42;
var hash = number.ToString().ToMD5();

代码:

using System;
using System.Security.Cryptography;
using System.Text;

public static class MD5Extensions
{
    public static string ToMd5(this string input)
    {
        var inputBytes = Encoding.ASCII.GetBytes(input);

        return inputBytes.ToMd5(0, inputBytes.Length);
    }

    public static string ToMd5(this byte[] inputBytes, int offset, int count)
    {
        Span<char> chars = stackalloc char[32];

        inputBytes.ToMd5(offset, count, chars);

        return chars.ToString();
    }

     public static void ToMd5(this byte[] input, int offset, int count, Span<char> destination)
    {
        using var md5 = MD5.Create();
        var hashBytes = md5.ComputeHash(input, offset, count);

        var charsWritten = 0;
        const string format = "X2";

        foreach (var hashByte in hashBytes)
        {
            if (hashByte.TryFormat(destination, out charsWritten, format))
            {
                destination = destination.Slice(charsWritten);
            }
            else
            {
                throw new InvalidOperationException(
                    $"byte '{hashByte}' could not be parsed using format '{format}' and avaible space of {destination.Length}");
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.