Мне нужно сгенерировать 10-значный уникальный идентификатор (люди SIP/VOIP должны знать, что это значение параметра в заголовке P-Charging-Vector). Каждый символ должен быть одним из 26 букв ASCII (с учетом регистра), одной из десяти цифр ASCII или дефиса-минуса.10 символьных идентификаторов, которые глобально и локально уникальны
Он ДОЛЖЕН быть «глобально уникальным (за пределами машины, генерирующим идентификатор)» и достаточно «локально уникальным» (внутри машины, генерирующей идентификатор) », и все, что нужно упаковать в 10 символов, фу!
Вот мой пример. Я ПЕРВАЯ кодировка «ДОЛЖЕН» быть закодированным глобально уникальным локальным IP-адресом в base-63 (его беззнаковый длинный int, который будет занимать 1-6 символов после кодирования), а затем насколько это возможно для текущей метки времени (ее long_t/long long int, который будет занимать 9-4 символа после кодирования в зависимости от того, сколько места занимает зашифрованный ip-адрес).
Я также добавил число циклов 'i' к отметке времени, чтобы сохранить уникальность в случае, если функция вызывается более одного раза в секунду.
Достаточно ли этого, чтобы быть глобально и локально уникальным или есть другой лучший подход?
Gaurav
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
//base-63 character set
static char set[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-";
// 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;
}
"х [индекс] = SET [LONGLONG% 63];" был перепутан выше и выглядит как «x [index] = set [longlongc];» – Gaurav