Мне нужно сгенерировать 10-символьный уникальный идентификатор (пользователи SIP/VOIP должны знать, что это значение параметра icid в заголовке P-Charging-Vector). Каждый символ должен быть одной из 26 букв ASCII (с учетом регистра), одной из 10 цифр ASCII или дефисом-минус.
Он ДОЛЖЕН быть «глобально уникальным (за пределами машины, генерирующей идентификатор)» и достаточно «локально уникальным (внутри машины, генерирующей идентификатор)», и все это должно быть упаковано в 10 символов, уф!
Вот мой взгляд на это. Я ПЕРВЫЙ кодирую «ДОЛЖЕН» кодировать глобально уникальный локальный IP-адрес в base-63 (это беззнаковое длинное целое число, которое будет занимать 1-6 символов после кодирования), а затем столько, сколько я могу текущей метки времени (его time_t/long long int, который будет занимать 9-4 символа после кодирования в зависимости от того, сколько места занимает закодированный IP-адрес в первую очередь).
Я также добавил число циклов «i» к метке времени, чтобы сохранить уникальность в случае, если функция вызывается более одного раза в секунду.
Достаточно ли этого, чтобы быть уникальным в глобальном и локальном масштабе, или есть другой лучший подход?
Гаурав
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
//base-63 character set
static char set[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-";
// b63() returns the next vacant location in char array x
int b63(long long longlong,char *x,int index){
if(index > 9)
return index+1;
//printf("index=%d,longlong=%lld,longlong%63=%lld\n",index,longlong,longlong%63);
if(longlong < 63){
x[index] = set[longlong];
return index+1;
}
x[index] = set[longlong%63];
return b63(longlong/63,x,index+1);
}
int main(){
char x[11],y[11] = {0}; /* '\0' is taken care of here */
//let's generate 10 million ids
for(int i=0; i<10000000; i++){
/* add i to timestamp to take care of sub-second function calls,
3770168404(is a sample ip address in n/w byte order) = 84.52.184.224 */
b63((long long)time(NULL)+i,x,b63((long long)3770168404,x,0));
// reverse the char array to get proper base-63 output
for(int j=0,k=9; j<10; j++,k--)
y[j] = x[k];
printf("%s\n",y);
}
return 0;
}