# Solution

`HashingUtils.ProtectAssetUrl(string url)` and `HashingUtils.GetAssetUrlHash(string url)` take the full URL path into account when generating the hash. So there are no adjustments in the algorithm that you need to make.

Just use this code:

    string imageUrl = // get the URL
    imageUrl = HashingUtils.ProtectAssetUrl(imageUrl);

This is all you need to generate a URL with an added hash value.

---

# Proof

Here's the (reformatted) source code of `HashingUtils.GetAssetUrlHash()`:

    public static string GetAssetUrlHash(string url)
    {
        url = url.ToLowerInvariant();

        UrlString urlString = new UrlString(url);

        if (!HashingUtils.Proxy.IsMediaUrl(url))
        {
            return string.Empty;
        }

        Uri result;
        string urlPath = (Uri.TryCreate(url, UriKind.Absolute, out result) ? result.LocalPath : urlString.Path).TrimStart('/');

        StringBuilder stringBuilder = new StringBuilder();

        stringBuilder.Append(string.Format("{0}?", urlPath));

        for (int i = 0; i < MediaManager.Config.RequestProtection.QueryParametersToProtect.Count; i++)
        {
            stringBuilder.Append(
                string.Format(
                    "{0}={1}",
                    MediaManager.Config.RequestProtection.QueryParametersToProtect[i],
                    urlString.Parameters[MediaManager.Config.RequestProtection.QueryParametersToProtect[i]]));

            if (i < MediaManager.Config.RequestProtection.QueryParametersToProtect.Count - 1)
            {
                stringBuilder.Append("&");
            }
        }

        return HashingUtils.ComputeHash(stringBuilder.ToString());
    }

As you can see, the URL path _is_ used when creating the hash. It's appended to the `stringBuilder`:

    stringBuilder.Append(string.Format("{0}?", urlPath));

The `urlPath` here will be equal to `/images/{22EB368A-4AD3-48C8-B1EB-1BC14DE0F7BF}-200-100.jpg` in your example.