automatically generate id when not specified