вторник, 11 августа 2009 г.

[comp.prog.bugs] Брошу еще один камень в огород ACE: сюрприз от UUID_Generator

Уже несколько лет активно пользуюсь библиотекой ACE. И чем больше пользуюсь, тем больше об этом жалею. Поскольку временами натыкаюсь в ней на неприятные сюрпризы и косяки. Вот и сегодня наступил на очередные грабли. На этот раз с генерацией UUID-ов посредством класса UUID_Generator (версии 5.6.*).

Оказалось, что если с очень коротким промежутком времени сгенерировать два UUID-а, то они окажутся одинаковыми! Два глобально уникальных идентификатора и одинаковых! Афигеть!

В Wikipedia указано, что существует пять версий алгоритма генерации UUID. И у класса UUID_Generator в методе generate_UUID есть аргумент version. По умолчанию он имеет значение 0x01. Т.е. первая версия, в которой для генерации UUID-а используется MAC-адрес и временная метка (со 100-наносекундной точностью). В принципе, в первой версии возможно создание дубликатов, если разница во времени между генерациями UUID-ов меньше 100-наносекунд. На современных компьютерах это запросто.

Но пакость в том, что ACE не поддерживает никаких других версий! И нигде в документации не пишет, что параметр version вовсе не определяет версию алгоритма. Поэтому очень неприятно было на тестах важного компонента вдруг получить два одинаковых UUID-а :( Хотя у меня в коде стоял вызов generate_UUID с параметром version раным 0x04. По наивности я думал, что ACE задействует четвертую версию алгоритма генерации UUID…

Простой тест показывает, что какую бы версию не задавали в параметре version, generate_UUID всегда будет генерировать два одинаковых UUID-а, если время между генерациями очень мало. Тогда как в библиотеке POCO класс UUIDGenerator запросто создает миллион уникальных UUID-ов при использовании четвертой версии алгоритма (UUIDGenerator::createRandom).

Такие дела. Еще раз убеждаюсь, что от ACE нужно отказываться. Поэтому, если вы собираетесь выбирать себе базовую C++ библиотеку, то обратите внимание в первую очередь на POCO, Qt или Boost. И только потом уже на ACE.

Комментариев нет: