You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将哈希生成的字节数组转换为保留小写的字符串?

问题

我尝试将哈希函数生成的字节数组转换为字符串,最初使用BitConverter.ToString()方法,但生成的是由短横线分隔的全大写字节字符串。我的基础方法如下:

public string Hash(string password)
{
    using var hasher = SHA512.Create();
    {
        var asBytes = Encoding.Default.GetBytes(password);
        var hashed = hasher.ComputeHash(asBytes);
        string stringhashed = BitConverter.ToString(hashed);
        return stringhashed;
    }
}

该方法能正确生成哈希,但输出格式为BYTE-BYTE-BYTE-...的形式,我需要的是全小写的常规字符串,请问有可行的实现方法吗?

解决方案

方法1:快速修改现有代码

直接对BitConverter.ToString()的结果做处理,去掉分隔符并转小写:

public string Hash(string password)
{
    using var hasher = SHA512.Create();
    var asBytes = Encoding.Default.GetBytes(password);
    var hashed = hasher.ComputeHash(asBytes);
    return BitConverter.ToString(hashed).Replace("-", "").ToLowerInvariant();
}

这种方式最简单,几乎不用改动原有逻辑,只是多了两步字符串处理,对于SHA512这类长度固定的哈希来说,性能影响可以忽略。

方法2:更高效的手动拼接

如果想避免中间字符串的额外开销,可以用StringBuilder直接遍历字节数组生成小写十六进制字符串:

public string Hash(string password)
{
    using var hasher = SHA512.Create();
    var asBytes = Encoding.Default.GetBytes(password);
    var hashed = hasher.ComputeHash(asBytes);
    
    var sb = new StringBuilder(hashed.Length * 2); // 预分配足够容量
    foreach (byte b in hashed)
    {
        sb.Append(b.ToString("x2")); // "x2"表示两位小写十六进制,自动补前导零
    }
    return sb.ToString();
}

这种方式直接操作字节生成目标格式,没有多余的字符串拆分与合并,性能更优,同时完全符合标准哈希字符串的格式要求。

额外建议

代码里的Encoding.Default依赖系统默认编码,可能在不同平台下得到不同的字节数组,建议换成Encoding.UTF8来保证跨环境一致性:

var asBytes = Encoding.UTF8.GetBytes(password);

内容的提问来源于stack exchange,提问作者NitroSage

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:20:27