Простая функция генерации случайных строк на C, пожалуйста. Покажи мне свое искусство!

Я работаю над небольшим (на самом деле не таким уж маленьким) проектом на C (ссылка этот вопрос), и мне нужна небольшая функция на C, которая генерировала бы уникальную и случайную строку.

Мне нужен небольшой, который я могу включить в качестве служебной функции в файл .c. Пожалуйста, помогите мне с вашими мозгами и покажите мне, как умно это можно сделать!

Спасибо и виртуально БОЛЬШОЕ объятие за лучшее решение :)

РЕДАКТИРОВАТЬ: (то, что я только что сказал msw ниже) Я действительно думаю, что мне просто нужна случайная строка в качестве ключа (которая будет выглядеть как uuid), и я думал, что это будет сделано с временными метками или чем-то подобным. (Я не хочу добавлять кучу файлов в свой проект только для генерации случайного ключа)

Извините за путаницу, все!

РЕДАКТИРОВАТЬ2: Спасибо всем за ваш вклад, я, наконец, буду использовать OSSP uuid lib с SHA-1 проще внедрить/интегрировать


person sandra    schedule 08.07.2010    source источник
comment
Йенс, правда! Я был неправ. посмотри мое редактирование   -  person sandra    schedule 08.07.2010


Ответы (5)


Не изобретайте велосипед заново, возможно, есть функция, которая уже написана для выбранной вами платформы: http://en.wikipedia.org/wiki/Uuid#Implementations

person msw    schedule 08.07.2010
comment
Вы правы мсв, это то, что я повторяю очень часто. На самом деле я думаю, что мне просто нужна случайная строка в качестве ключа (которая будет выглядеть как uuid), и я думал, что это будет сделано с временными метками или чем-то подобным. (Я не хочу добавлять кучу файлов в свой проект только для генерации случайного ключа) - person sandra; 08.07.2010
comment
Если вам нужны уникальные ключи базы данных, это другая проблема с другим решением, измените свой вопрос, если это так. Временные метки — плохая основа для UUID, а [GU]UID — излишество для баз данных. - person msw; 08.07.2010
comment
msw, допустим, мне нужна случайная строка. Я не буду использовать sqlite3 в качестве базы данных. На самом деле я был не прав, мне нужен случайный ключ (он был бы уникальным только для меня в этом самом приложении) - person sandra; 08.07.2010
comment
Именно для этого предназначены UUID, см. мою ссылку в этом ответе, и вы можете подумать о переходе на кофе без кофеина;) - person msw; 08.07.2010

Еще одна ссылка для вас - источник libuuid из файла ext2fs.

person Nikolai Fetissov    schedule 08.07.2010

Вы можете посмотреть на это интернет-черновик, который объясняет всю концепцию и пытается реализовать один из алгоритмов.

person Praveen S    schedule 08.07.2010

А счетчик?

Если вы не используете многопоточность, просто сохраните фактическое значение в переменной static. (Поскольку вам нужна строка, вам нужно будет сделать sprintf или около того, чтобы получить то, что вам нужно.)

Если вы на самом деле многопоточны, когда вы создаете свой случайный ключ с помощью sprintf, склейте счетчик вместе с идентификатором потока и/или процесса.

person Jens Gustedt    schedule 08.07.2010

А как насчет tmpnam?

person Alexandre C.    schedule 09.07.2010