#include #include #include #define IDLN 8 #define CHARSET \ "abcdefghijklmnopqrstuvwxyz" \ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ "0123456789" \ "-_!~" #define CHARSETLN (sizeof(CHARSET) - 1) char* gen() { char* id = malloc(IDLN + 1); if (id == NULL) { perror("malloc"); exit(1); } unsigned char buf[IDLN]; if (RAND_bytes(buf, IDLN) != 1) { perror("RAND_bytes"); free(id); exit(1); } for ( int i = 0; i < IDLN || (id[IDLN] = '\0'); id[i++] = CHARSET[buf[i] % CHARSETLN] ); return id; } int main(void) { char* id = gen(); printf("%s", id); free(id); }