Байты, по-видимому, распределены неравномерно.
Я собрал некоторый код для выборки руководств .NET и построил график распределения:
Прежде всего, тестовый код, это создает миллионНаправляет и подсчитывает количество различных значений для каждого байта в байтовом массиве.Он выводит все это в матрицу, которую я строю в Scilab .
int[,] counter = new int[16, 256];
for (int i = 0; i < 1000000; i++)
{
var g = Guid.NewGuid();
var bytes = g.ToByteArray();
for (int idx = 0; idx < 16; idx++)
{
counter[idx, bytes[idx]]++;
}
}
StringBuilder sb = new StringBuilder();
sb.AppendLine("x = [");
for (int idx = 0; idx < 16; idx++)
{
for (int b = 0; b < 256; b++)
{
sb.Append(counter[idx, b]);
if (idx != 255)
{
sb.Append(" ");
}
}
if (idx != 15)
{
sb.AppendLine(";");
}
}
sb.AppendLine("]");
File.WriteAllText("plot.sce", sb.ToString());
Вот распределения, графики отображают количество каждого отдельного значения для каждой из позиций в байтемассив:
Распределение значений для позиций 0-6 в байтовом массиве:
Распределение значений для позиции 7 в байтовом массиве:
Распределение значений для позиции 8 в байтовом массиве:
Распределение значений для позиций 9-15 в байтовом массиве:
Для байтовых позиций 0-6 и9-15 распределение значений кажется равномерным, но для позиции байтов 7 и 8 распределение довольно ограничено.
То есть для guid (с началом позиций байтов ниже, обратите внимание на странный порядок)
{1369ea05-b9f9-408b-ac7c-7ebd0f35d562}
1 1 1 1 1 1
3 2 1 0 5 4 7 6 8 9 0 1 2 3 4 5
Позиция 7 может принимать значения от 64 (0x40) до 79 (0x4F).
Позиция 8 может принимать значения от 128 (0x80) до 191 (0xBF).
Остальные байты распределены равномерно.
Примечание: Тесты проводились в .NET4 на 32-разрядной машине с Windows 7.
Урок: не принимайте во внимание, тестируйте.
Ответ: Чтобы использовать .NET Guids для расчета балансировки нагрузки, вы можете использовать любую деталь, кроме позиций, отмеченных 7 и 8 в Руководстве выше.
Вопрос: Кто-нибудь знает, ПОЧЕМУ распределение не распределяется равномерно?