字符串怎生成hash值才能避免重复?(生成唯一ID)

bandaoyu 2019-04-03 03:37:20


人员的 识别码idCode 最长50个字符(字母和数字),用什么hash函数转成哈希值(唯一ID)且 基本不可能重复?

网上看到:

unsigned int hash(char *str)
{

register unsigned int h;
register unsigned char *p;
for(h = 0, p = (unsigned char *)str; *p ; p++)
h = 31 * h + *p;
return h;
}

但是感觉只用unsigned int ,很容易就溢出了。担心溢出之后,剩下的部分冲突率比较高


所以我改成unsigned long long, 哈希值的位数比unsigned int 宽了一倍。 冲突(重复的概率)是否可以忽略不计了?

unsigned long long hash(char *str)
{

unsigned long long h;
unsigned char *p;
for(h = 0, p = (unsigned char *)str; *p ; p++)
h = 31 * h + *p;
return h;
}


1 的重复率 和 2的重复率分别是多少? 能满足我们的唯一ID的需求吗?我们的用户数设计是10000人,条码是50个字母和数字组成的。
...全文
7029 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
心外无物~ 2021-12-14
  • 打赏
  • 举报
回复

定时任务批量生成一定量的短hash id,存数据库,自己去重

bandaoyu 2019-04-05
  • 打赏
  • 举报
回复
引用 7 楼 hanxb 的回复:
嗯,所以说理论上没有不碰撞的,但是实际上只有碰撞够小,那就可以接受
bandaoyu 2019-04-05
  • 打赏
  • 举报
回复
引用 6 楼 tongshou 的回复:
晕 ,你说的ID 那也得现有ID呀,现在我就是想用hash生成ID
老葱1# 2019-04-05
  • 打赏
  • 举报
回复
哈希值就算不重复, 模 哈希表 后还是会冲突, 除非你的哈希表 占满unsigned int 范围( 这就是 4G 大小内存)。 所以这个生成唯一ID的说法是错误的, 哈希算法只能是尽量离散。 另外, 溢出后就环回, 不影响离散性。 字符串哈希算法很多,常用算法: u_int32 HashValue(LPCSTR key) const{ u_int32 nHash = 0; while (*key) nHash += (nHash<<5) + *key++; // DJB Hash Function return nHash; }
tongshou 2019-04-03
  • 打赏
  • 举报
回复
如果不能接受重复(哪怕机会很小),不要用HASH表。如果人数仅仅1万人,你可以另外设立一个很简单的 ID 表(一个普通整数),让其与 ”人员的 识别码idCode “ 相互对应,相互查找。
bandaoyu 2019-04-03
  • 打赏
  • 举报
回复
引用 4 楼 niiiloc 的回复:
HASH 有很多种算法 那种是标准?
636f6c696e 2019-04-03
  • 打赏
  • 举报
回复
请用标准哈希算法来生成,如果希望尽可能避免重复,推荐使用sha256
bandaoyu 2019-04-03
  • 打赏
  • 举报
回复
引用 1 楼 LCL_data 的回复:
直接用uuid,肯定不会重复?
uuid 我还不如直接别用户条码,128字节 呀大哥
smwhotjay 2019-04-03
  • 打赏
  • 举报
回复
md5 sha1
十八道胡同 2019-04-03
  • 打赏
  • 举报
回复
直接用uuid,肯定不会重复?

65,189

社区成员

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

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