Идентификатор GUID может быть хорошим ключевых разделов?
Мне приходится хранить много гигабайт данных на нескольких машинах. Файлы однозначно идентифицируются Guid, и один файл может быть размещен только на одной машине. Мне было интересно, могу ли я использовать Guid в качестве ключа раздела, чтобы определить, какую машину я должен использовать для хранения данных. Если да, то какова будет моя функция секционирования?
В противном случае, как я мог бы разделить свои данные таким образом, чтобы вся машина получала очень похожую нагрузку?
Спасибо!
P.S. Я не использую Sql Server, Oracle или любой другой DB. Это все внутренний код. П. С. С. идентификатор GUID генерируются с помощью .Чистая идентификатор функции.Метод newguid().
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 машины, хотя вы можете затем разделить снова на другой байт, являющийся нечетным или четным.
Если вы хотите выполнить циклический перебор вашего распределения, я бы посмотрел на возможность синхронизированного счетчика, который вы % количество машин, которые у вас есть в классическом циклическом порядке.
Синхронизированный счетчик может быть полем в базе данных, отдельным веб-сервисом или файлом в сети и т. д. Все, что может быть увеличено при каждом размещении файла.