Генерирование уникальный значений в разных процессах. erlang
От: Аноним  
Дата: 09.05.09 12:11
Оценка:
Такая ситуация:
Есть рекурсивная функция F, внутри которой порождается несколько процессов, затем выполним задачу они умирают, и происходит новый вызов функции, и т.д.

Проблема в том, что в каждом процессе необходимо генерировать несколько чисел (сколько именно, становится известно только внутри процесса, число находится в разумных пределах, т.е. скорее всего не будет превышать 1 000 000, однако могут быть исключения). И вот если из каждого процесса взять все числа то все они должны быть уникальные. При последующем вызове функции F, в нее передается ЧАСТЬ этих чисел и в последствии их использовать уже нельзя.
Как я сейчас это реализую. имеется два вариант:
1) Очень элементарный, беру системное время в микросекундах и из него конструирую число. Мне пока так и не понятно, если система работает на одной машине может ли получится такая ситуация что в разных процессах erlang:now(). вернет одно и тоже значение? Я проводил опыты, вроде бы все значения были уникальные (с разницей в 1-3 микросекунды). Но всё равно уверенности нет, поэтому это первый вопрос.
2) если 1) работает так как мне хотелось бы, то как быть с системой работающей на нескольких машинах? — в этом случае время может сгенерироваться одинаковое. Перестановка времени на каждой машине, конечно неприемлема). Поэтому в данном случае я в каждый процесс запускаю некоторое число (внутри числа генерятся просто добавляя единицу постепенно) след образом: в первый процесс N, во второй N+m, третий N+2*m и т.д. так как всего кол-во чисел в процессе врятли превысит 1 000 000, то m=1 000 000 (однако каким бы m я не взял, всё равно есть хоть и маленькая, но положительная вероятность, что кол-во чисел окажется больше m ив конечном итоге где может произойти роковое дублирование), а при очередном вызове F, я передаю ему параметром новое значение N, равное N+n*(k+1), где k — кол-во созданных процессов.

Как видно, оба подходя имеют некоторые недостатки.
Если ли какие-то более надежные варианты решения такой проблемы? желательно быстродействующие (т.е. генерация числа не должна занимать много времени)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.