public static VQVerifyHashResult VerifyHashArgon(
            this string hash,
            string password,
            ulong opsLimite = VQSodiumLibrary.crypto_pwhash_argon2id_OPSLIMIT_MODERATE,
            int memLimit    = VQSodiumLibrary.crypto_pwhash_argon2id_MEMLIMIT_MODERATE)
        {
            var passwdHash = StringToUtf8Byte(password);
            var hashBytes  = HexStringToByte(hash);
            var ret        = VQSodiumLibrary.crypto_pwhash_str_verify(
                hashBytes,
                passwdHash,
                Convert.ToUInt64(passwdHash.GetLongLength(0)));

            if (ret != 0)
            {
                return(VQVerifyHashResult.FAILED);
            }

            ret = VQSodiumLibrary.crypto_pwhash_str_needs_rehash(hashBytes, opsLimite, memLimit);
            if (ret < 0)
            {
                throw new Exception($"crypto_pwhash_str_needs_rehash: failed with result {ret}");
            }

            return(ret == 0 ? VQVerifyHashResult.PASSED : VQVerifyHashResult.NEEDS_REHASH);
        }
        public static string GetHashArgon(
            this string text,
            ulong opsLimite = VQSodiumLibrary.crypto_pwhash_argon2id_OPSLIMIT_MODERATE,
            int memLimit    = VQSodiumLibrary.crypto_pwhash_argon2id_MEMLIMIT_MODERATE)
        {
            var buffer = new byte[128];

            var texthash = StringToUtf8Byte(text);

            var result = VQSodiumLibrary.crypto_pwhash_str(
                buffer,
                texthash,
                Convert.ToUInt64(texthash.GetLongLength(0)),
                Convert.ToUInt64(opsLimite),
                memLimit);

            if (result != 0)
            {
                throw new OutOfMemoryException("Out of memory in get hash argon2");
            }

            var bufferTrim = buffer.Where(x => x != 0x00).ToArray();

            return(BitConverter.ToString(bufferTrim).Replace(BYTE_SEPARATOR, STRING_EMPTY));
        }