public Value mhash(Env env, int hash, StringValue data, @Optional string key)
        {
            if (key != null)
            {
                throw new UnsupportedOperationException("key");
            }

            MhashAlgorithm algorithm = _algorithmMap.get(hash);

            if (algorithm == null)
            {
                return(BooleanValue.FALSE);
            }

            MessageDigest messageDigest = algorithm.createMessageDigest();

            if (messageDigest == null)
            {
                log.warning(L.l("no MessageDigest for {0}", algorithm));

                return(BooleanValue.FALSE);
            }

            byte[] result = messageDigest.digest(data.toBytes());

            return(env.createBinaryBuilder(result));
        }
        public Value mhash_get_block_size(int hash)
        {
            MhashAlgorithm algorithm = _algorithmMap.get(hash);

            if (algorithm == null || algorithm.createMessageDigest() == null)
            {
                return(BooleanValue.FALSE);
            }

            return(LongValue.create(512)); // XXX: stubbed
        }
        private void addAlgorithm(int ordinal, string name, string javaName)
        {
            MhashAlgorithm algorithm = new MhashAlgorithm(name, javaName, null);

            _algorithmMap.put(ordinal, algorithm);

            if (_highestOrdinal < ordinal)
            {
                _highestOrdinal = ordinal;
            }
        }
        public Value mhash_get_hash_name(Env env, int hash)
        {
            MhashAlgorithm algorithm = _algorithmMap.get(hash);

            if (algorithm == null)
            {
                return(BooleanValue.FALSE);
            }
            else
            {
                return(env.createString(algorithm.getName()));
            }
        }