/// <summary>
 /// Calculates the hash for fixed length data.
 /// </summary>
 /// <exception cref="T:System.ArgumentNullException">data is null.</exception>
 public PreEncryptData Calculate(PreEncryptData data)
 {
     if (data == null)
     {
         throw new ArgumentNullException(nameof(data));
     }
     return(CalculatePrivate(data.Bytes));
 }
        /// <summary>
        /// Calculates the hash for fixed length data with a prefixed salt value.
        ///  </summary>
        /// <exception cref="T:System.ArgumentNullException">data or salt is null.</exception>
        /// <remarks>A "salt" value is random data prefixed to every hashed value to prevent common dictionary attacks.</remarks>
        public PreEncryptData Calculate(PreEncryptData data, PreEncryptData salt)
        {
            if (data == null)
            {
                throw new ArgumentNullException(nameof(data));
            }
            if (salt == null)
            {
                throw new ArgumentNullException(nameof(salt));
            }

            var value = new byte[data.Bytes.Length + salt.Bytes.Length];

            salt.Bytes.CopyTo(value, 0);
            data.Bytes.CopyTo(value, salt.Bytes.Length);
            return(CalculatePrivate(value));
        }