When programming the Uno's, you could write identifying values into particular EEPROM bytes. To automate the process, write a development-system program to produce serial-numbered HEX files, with the serial number counting up each time the program runs.
For example, if you store IDs into byte 0x1E of EEPROM, the serial number file would look as follows when the serial number is 0x23:
The first line in the above file says 01 bytes of payload, stored at address 001E, record type 00 (data), payload byte 23, checksum BE. See wikipedia's Intel HEX article for further explanation of HEX file format. In brief, each time the serial number byte goes up by one, the checksum byte goes down by one.
To program a serial number byte into EEPROM from a file called
SNfile.hex, issue a command like the following.
avrdude -p atmega328p -c arduino -P /dev/ttyUSB1 -b57600 -U eeprom:w:SNfile.hex:i
avrdude manpage for explanation.
In your sketch, use EEPROM.read(address) to read a unit's serial number. For example:
byte mySN = EEPROM.read(0x1E);
[Note, regarding your question about “anything built in... to act as a unique identifier”, I once spent quite a while looking for such a thing on Uno, Nano, and Mega2560 Arduinos, and found nothing. I haven't looked at XBee radio modules for such data.]