diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Files.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Files.cs index 6d0655b..cf0cf9d 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Files.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Files.cs @@ -59,6 +59,7 @@ public partial class MareHub { var forbiddenFile = forbiddenFiles.SingleOrDefault(f => string.Equals(f.Hash, file.Hash, StringComparison.OrdinalIgnoreCase)); + shardConfig.Shuffle(); var matchedShardConfig = shardConfig.Find(f => f.FileMatchRegex.Match(file.Hash).Success); var baseUrl = matchedShardConfig?.CdnFullUrl ?? _mainCdnFullUrl; diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/StringUtils.cs b/MareSynchronosServer/MareSynchronosShared/Utils/StringUtils.cs index 052bda9..ede0ec3 100644 --- a/MareSynchronosServer/MareSynchronosShared/Utils/StringUtils.cs +++ b/MareSynchronosServer/MareSynchronosShared/Utils/StringUtils.cs @@ -29,3 +29,21 @@ public static class StringUtils return BitConverter.ToString(sha256.ComputeHash(Encoding.UTF8.GetBytes(input))).Replace("-", "", StringComparison.OrdinalIgnoreCase); } } + +public static class ListUtils +{ + private static Random rng = new(); + + public static void Shuffle(this IList list) + { + int n = list.Count; + while (n > 1) + { + n--; + int k = rng.Next(n + 1); + T value = list[k]; + list[k] = list[n]; + list[n] = value; + } + } +} \ No newline at end of file