我现在有一字符串,怎样生成一个唯一的ID?

大儿童梦里花开 2011-07-29 10:29:06
如题。。。


...全文
1531 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
sivolin 2011-07-30
  • 打赏
  • 举报
回复
嫌麻烦就直接用散列函数就好了嘛
tiandi0074 2011-07-29
  • 打赏
  • 举报
回复
还是用md5等算法吧,就是这些算法都在特定条件下会要唯一值装车的情况,除非比他更先进不然很难保证唯一
赵4老师 2011-07-29
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <memory.h>
const unsigned int s[4][4]={{7,12,17,22},{5,9,14,20},{4,11,16,23},{6,10,15,21}};
const unsigned long t[64]={//t[i]=4294967296*fabs(sin(i+1));
0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,
0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,
0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,
0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,
0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,
0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,
0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,
0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391
};
const int serial[64]={
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12,
5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2,
0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9
};
void func(unsigned long& a,
unsigned long b,
unsigned long c,
unsigned long d,
unsigned long M,
unsigned long t,
int s,
int turn) {
unsigned long temp;
switch(turn) {
case 0:
temp=(b&c)|((~b)&d);
break;
case 1:
temp=(d&b)|((~d)&c);
break;
case 2:
temp=b^c^d;
break;
case 3:
temp=c^(b|(~d));
break;
}
temp+=M+t+a;
_asm {
mov ecx,s
rol temp,cl
}
a=b+temp;
}
void MD512(const unsigned long M[16],unsigned long hash[4]) {
int i,j,index=0;
for (i=0;i<4;i++)
for (j=0;j<4;j++) {
func(hash[0],hash[1],hash[2],hash[3],M[serial[index]],t[index],s[i][0],i);
index++;
func(hash[3],hash[0],hash[1],hash[2],M[serial[index]],t[index],s[i][1],i);
index++;
func(hash[2],hash[3],hash[0],hash[1],M[serial[index]],t[index],s[i][2],i);
index++;
func(hash[1],hash[2],hash[3],hash[0],M[serial[index]],t[index],s[i][3],i);
index++;
}
}

void MD5(char* M,int nLen,unsigned long output[4]) {
int i,j;
unsigned long Hash[4]={0x67452301,0xefcdab89,0x98badcfe,0x10325476};
unsigned long hash[4];

//填充
__int64 BitsLen=nLen*8;
int oldlen=nLen;
while(nLen%64!=56) {
M[nLen++]=0;
}
M[oldlen]=0x80u;
*(__int64*)(M+nLen)=BitsLen;
nLen+=8;

//开始处理分组
for (i=0;i<nLen;i+=64) {
memcpy(hash,Hash,sizeof(long)*4);
MD512((const unsigned long*)&M[i],hash);//处理512bits分组
for (j=0;j<4;j++)
Hash[j]+=hash[j];
}

//处理输出。
for (i=0;i<4;i++)
for (j=3;j>=0;j--) {
*((char*)(output+i)+j)=*((char*)(Hash+i)+3-j);
}
}
int main() {
int i;
char szMessage[1000]={0};
printf("input a string:\n>>>");
scanf("%s",szMessage);
unsigned long output[4];
MD5(szMessage,strlen(szMessage),output);
for (i=0;i<4;i++)
printf("%08lx",output[i]);
printf("\n");
return 0;
}
pathuang68 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jpcfei 的回复:]

引用 5 楼 luciferisnotsatan 的回复:
引用 2 楼 jpcfei 的回复:

引用 1 楼 akirya 的回复:
用md5和sha1


都是加密算法,成本太高,有没有较一般的?

成本指什么成本?效率?



我指的成本是: MD5用C++实现起来,代码太多。


我想找代码相对较少的。

望高人赐教
[/Quote]

还算好吧,代码不算太多。再说如果已经有了现成的代码,你在使用的时候,不过就是调用而已。
pathuang68 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jpcfei 的回复:]

引用 1 楼 akirya 的回复:
用md5和sha1


都是加密算法,成本太高,有没有较一般的?
[/Quote]
成本不高滴,速度也很快。我也强烈建议用md5或者sha或者更先进的算法,其它的办法都很不靠谱。

md5和sha的源代码网上有很多。
TitanQuest 2011-07-29
  • 打赏
  • 举报
回复
zhegeba,hehe
tony2278 2011-07-29
  • 打赏
  • 举报
回复

先判断比较一下,如果接收到字符串,如果字符串ID值已存在,则不生成,否则再使用获取系统时间函数 用其返回值做ID。不知这样行不?



夹心饼干 2011-07-29
  • 打赏
  • 举报
回复
建议你可以参考下linux下SGI const char*的hash函数
Michael_Xie 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 teatimel 的回复:]

接收字符串时使用获取系统时间函数 用其返回值做ID
[/Quote]

每次接收到字符都一样,其ID值是一样的吗?
品茶 2011-07-29
  • 打赏
  • 举报
回复
接收字符串时使用获取系统时间函数 用其返回值做ID
luciferisnotsatan 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jpcfei 的回复:]

引用 5 楼 luciferisnotsatan 的回复:
引用 2 楼 jpcfei 的回复:

引用 1 楼 akirya 的回复:
用md5和sha1


都是加密算法,成本太高,有没有较一般的?

成本指什么成本?效率?



我指的成本是: MD5用C++实现起来,代码太多。


我想找代码相对较少的。

望高人赐教
[/Quote]
MD5的源码,网上到处都是
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jpcfei 的回复:]

引用 5 楼 luciferisnotsatan 的回复:
引用 2 楼 jpcfei 的回复:

引用 1 楼 akirya 的回复:
用md5和sha1


都是加密算法,成本太高,有没有较一般的?

成本指什么成本?效率?



我指的成本是: MD5用C++实现起来,代码太多。


我想找代码相对较少的。

望高人赐教
[/Quote]
rfc上有现成的实现,拷贝过来就行了。
Michael_Xie 2011-07-29
  • 打赏
  • 举报
回复
简单的就是人工设定
ryfdizuo 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dizuo 的回复:]

http://www.byvoid.com/blog/string-hash-compare/
[/Quote]
你可以试试 这里的几个哈希函数。就一个函数
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luciferisnotsatan 的回复:]
引用 2 楼 jpcfei 的回复:

引用 1 楼 akirya 的回复:
用md5和sha1


都是加密算法,成本太高,有没有较一般的?

成本指什么成本?效率?
[/Quote]


我指的成本是: MD5用C++实现起来,代码太多。


我想找代码相对较少的。

望高人赐教
  • 打赏
  • 举报
回复
例如

char* str = "abcdefghijk";

我怎样用str生成一个唯一的整形值??
luciferisnotsatan 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jpcfei 的回复:]

引用 1 楼 akirya 的回复:
用md5和sha1


都是加密算法,成本太高,有没有较一般的?
[/Quote]
成本指什么成本?效率?
至善者善之敌 2011-07-29
  • 打赏
  • 举报
回复
MD5~
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 akirya 的回复:]
用md5和sha1
[/Quote]

都是加密算法,成本太高,有没有较一般的?
加载更多回复(10)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧