Идентификатор GUID может быть хорошим ключевых разделов?


Мне приходится хранить много гигабайт данных на нескольких машинах. Файлы однозначно идентифицируются Guid, и один файл может быть размещен только на одной машине. Мне было интересно, могу ли я использовать Guid в качестве ключа раздела, чтобы определить, какую машину я должен использовать для хранения данных. Если да, то какова будет моя функция секционирования?

В противном случае, как я мог бы разделить свои данные таким образом, чтобы вся машина получала очень похожую нагрузку?

Спасибо!

P.S. Я не использую Sql Server, Oracle или любой другой DB. Это все внутренний код. П. С. С. идентификатор GUID генерируются с помощью .Чистая идентификатор функции.Метод newguid().

3 3

3 ответа:

Как сказал Джеймс в своем комментарии, Вам нужно что-то, что имеет хорошее, равномерное распределение. GUID не обладают этим свойством. Я бы рекомендовал хэш, даже такой простой, как хэш самого Guid.

Хэш SHA-1 имеет хорошее распределение. Я бы не рекомендовал четное/нечетное хеширование, если вы не планируете только распределение между 2 машинами.

Поскольку GUID являются случайными, вы можете распределить их, сохранив нечетные GUID на одной машине и четные GUID на другой...

static void Main(string[] args)
{
    var tests = new List<Guid>();

    for (int i = 0; i < 100000; i++)
    {
        tests.Add(Guid.NewGuid());
    }

    Console.WriteLine("Even: " + tests.Where(g => g.ToByteArray().Last() % 2 == 0).Count());
    Console.WriteLine("Odd : " + tests.Where(g => g.ToByteArray().Last() % 2 == 1).Count());
    Console.ReadKey(true);
}

Дает почти равное распределение.

EDIT

Действительно, это не будет работать при разбиении на более чем 2 машины, хотя вы можете затем разделить снова на другой байт, являющийся нечетным или четным.

Если вы хотите выполнить циклический перебор вашего распределения, я бы посмотрел на возможность синхронизированного счетчика, который вы % количество машин, которые у вас есть в классическом циклическом порядке.

Синхронизированный счетчик может быть полем в базе данных, отдельным веб-сервисом или файлом в сети и т. д. Все, что может быть увеличено при каждом размещении файла.