public static Md5Checksummer createFromClassName(String cname)
    {
        final String msg = "create md5, name='" + cname + "' ";
        try
        {
            Class< ? > c = Class.forName(cname);
            if (Md5Checksummer.class.isAssignableFrom(c))
            {
                return (Md5Checksummer) c.newInstance();
            }
            else
            {
                throw new SecretShareException(msg + " does not implement interface " +
                                               Md5Checksummer.class.getName());
            }
        }
        catch (InstantiationException e)
        {
            throw new SecretShareException(msg + "instantiation", e);
        }
        catch (IllegalAccessException e)
        {
            throw new SecretShareException(msg + "access", e);
        }
        catch (ClassNotFoundException e)
        {
            throw new SecretShareException(msg + "class not found", e);
        }
    }