во первых, мы тут не знаем, что на самом деле нужно. и судя по молчанию автора — это типичный вброс абстрактной задачи. уникальные ключи позволяют использовать только одно поле. неуникальные — два.
во вторых, оба метода генерируют псевдослучайное число. mt_rand эффективней. смысл спорить о том, что для чего предназначено? книга предназначена для чтения, а я в ней гербарий сушу. какой я плохой)
рандомайзер не гарантирует уникальности. впрочем, да, рандомайзер эффективней связки uniqid+md5, которая также не гарантирует уникальность. так что лучше использовать рандом.
ого, сюда оказывается можно писать без ограничений >:-] тогда разверну мысль:
1. оператор in предназначен для проверки существования ключа, а не существования значения. а в качестве значения в хэше может оказаться и null и undefined. потому что писать hash.key= getValue() проще и понятней, чем var result= getValue(); if( result ) hash.key= result
2. in дискредитирует себя тем, что гуляет по прототипам, из-за чего проверку существования ключа в самом хэше приходится делать через костыль hasOwnProperty
3. вполне нормально желание удалить переменную, когда она больше не нужна, чтобы интерпретатор знал, что для последующего кода она не определена и выдал соответствующее предупреждение, в случае её использования. при копипасте, знаете ли, всякое бывает. и случайно заюзать неинициализированную переменную одноимённую другой инициализированной — вполне можно. и не надо сказок, что профи не копипастят код и пишут без ошибок)
4. сделать переменную «неустановленной» очень просто: variable= void 0 хотя это и не удаление самой переменной, а только её значения. хотя, если переменная глобальна — можно удалить её из window)