Может ли guid быть хорошим ключом раздела? - PullRequest
3 голосов
/ 25 июля 2011

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

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

Спасибо!

P.S. Я не использую Sql Server, Oracle или любую другую БД. Это все внутренний код. P.S.S. Guid генерируется с помощью функции .NET Guid.NewGuid ().

Ответы [ 3 ]

4 голосов
/ 25 июля 2011

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

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

0 голосов
/ 26 июля 2011

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

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

0 голосов
/ 25 июля 2011

Поскольку идентификаторы 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 машины, хотя вы можете затем снова разделить другой байт, будучи нечетным или четным.

...