# 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.