10 文字の一意の ID を生成する必要があります (SIP/VOIP 関係者は、それが P-Charging-Vector ヘッダーの param icid-value であることを知っておく必要があります)。各文字は、26 個の ASCII 文字 (大文字と小文字を区別) の 1 つ、10 桁の ASCII 数字の 1 つ、またはハイフンマイナスである必要があります。
それは「グローバルに一意 (ID を生成するマシンの外部)」であり、十分に「ローカルに一意 (ID を生成するマシン内)」でなければならず、すべてを 10 文字に詰め込む必要があります。
これが私の見解です。私は最初に「MUST」をグローバルに一意のローカル IP アドレスを base-63 (エンコード後に 1 ~ 6 文字を占める unsigned long int) にエンコードし、次に現在のタイムスタンプ (そのエンコードされた IP アドレスが最初に占めるスペースの量に応じて、エンコード後に 9 ~ 4 文字を占める time_t/long long int)。
また、関数が 1 秒間に複数回呼び出された場合に一意性を維持するために、ループ カウント '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;
}