Java 当您多次执行MessageDigest.update时,MessageDigest在做什么?

Java 当您多次执行MessageDigest.update时,MessageDigest在做什么?,java,c#,Java,C#,我有一个Java方法,我正在移植到C#,它使用salt散列字符串。方法是执行如下操作 private byte[] hash(byte[] bytes, byte[] salt) { MessageDigest digester = MessageDigest.getInstance("SHA-256"); digester.update(salt); digester.update(bytes); byte[] hashed = digester.digest(

我有一个Java方法,我正在移植到C#,它使用salt散列字符串。方法是执行如下操作

private byte[] hash(byte[] bytes, byte[] salt) {
    MessageDigest digester = MessageDigest.getInstance("SHA-256");
    digester.update(salt);
    digester.update(bytes);
    byte[] hashed = digester.digest();
    return hashed;
}
我不明白双重更新函数在做什么。它真的在做什么吗

这个问题被重新提出,因为它被错误地标记为重复。我找到了答案,决定与大家分享


Java中的MessageDigest和c中的HashAlgorithm的区别在于MessageDigest是有状态的,而HashAlgorithm不是。调用MessageDigest.update时,将提供的字节数组追加到MessageDigest中的字节数组。调用MessageDigest.digest时会重置此设置

在c#中,由于HashAlgorith不是有状态的,所以它只对提供的任何内容进行散列。与问题中的哈希函数等效的c#方法如下

private byte[] Hash(byte[] bytes, byte[] salt)
{   
    HashAlgorithm sha256 = new SHA256CryptoServiceProvider();
    byte[] combined = salt.Concat(bytes).ToArray();
    byte[] hashed = sha256.ComputeHash(combined);
    return hashed;
}