全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java 中HashCode重复的可能性

java 中HashCode重复的可能性

今天有同事提议用String的hashcode得到int类型作为主键。其实hashcode重复的可能性超大,下面是java的缺省算法:  

public int hashCode() { 
  int h = hash; 
  if (h == 0) { 
    int off = offset; 
    char val[] = value; 
    int len = count; 
 
      for (int i = 0; i < len; i++) { 
        h = 31*h + val[off++]; 
      } 
      hash = h; 
    } 
    return h; 
  }

但是什么情况下会重复?下面是测试代码

import java.util.HashMap; 
 
public class Test { 
 
  static HashMap map = new HashMap(); 
 
  private static char startChar = 'A'; 
 
  private static char endChar = 'z'; 
 
  private static int offset = endChar - startChar + 1; 
 
  private static int dup = 0; 
 
  public static void main(String[] args) { 
    int len = 3; 
    char[] chars = new char[len]; 
    tryBit(chars, len); 
    System.out.println((int)Math.pow(offset, len) + ":" + dup); 
  } 
 
  private static void tryBit(char[] chars, int i) { 
    for (char j = startChar; j <= endChar; j++) { 
      chars[i - 1] = j; 
      if (i > 1) 
        tryBit(chars, i - 1); 
      else 
        test(chars); 
    } 
  } 
 
  private static void test(char[] chars) { 
 
    String str = new String(chars).replaceAll("[^a-zA-Z_]", "").toUpperCase();// 195112:0 
    //String str = new String(chars).toLowerCase();//195112:6612 
    //String str = new String(chars).replaceAll("[^a-zA-Z_]","");//195112:122500 
    //String str = new String(chars);//195112:138510 
    int hash = str.hashCode(); 
    if (map.containsKey(hash)) { 
      String s = (String) map.get(hash); 
      if (!s.equals(str)) { 
        dup++; 
        System.out.println(s + ":" + str); 
      } 
    } else { 
      map.put(hash, str); 
      // System.out.println(str); 
    } 
  } 
} 

在A-z范围内有特殊字符,从结果看,仅仅3位长度的字符串:

不处理: 138510次重复

去掉字母意外字符: 122500次重复

所有字符转小写:6612次重复(少了很多)

去掉字母意外字符,并且转小写:没有重复!4位字符串也没见重复

不难看出:

1. 缺省实现为英文字母优化
2. 字母大小写可能导致重复

可能:

长字符串可能hashcode重复
中文字符串和特殊字符可能hashcode重复

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持,如有疑问请留言或者到本站社区交流讨论,大家共同进步!


# java  # HashCode  # HashCode的重复测试  # java中hashCode方法与equals方法的用法总结  # 详解hashCode()和equals()的本质区别和联系  # 重写hashCode()和equals()方法详细介绍  # JAVA hashCode使用方法详解  # 详解Java中用于查找对象哈希码值的hashCode()函数  # 为什么在重写 equals方法的同时必须重写 hashcode方法  # why在重写equals时还必须重写hashcode方法分享  # javascript中实现兼容JAVA的hashCode算法代码分享  # 重新实现hashCode()方法  # 特殊字符  # 也没  # 如有  # 希望能  # 少了  # 内有  # 谢谢大家  # 英文字母  # 共同进步  # 主键  # 疑问请  # 情况下  # return  # import  # count  # len  # lt  # startChar  # map  # private 


相关文章: c# await 一个已经完成的Task会发生什么  如何在云虚拟主机上快速搭建个人网站?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  如何用狗爹虚拟主机快速搭建网站?  建站主机默认首页配置指南:核心功能与访问路径优化  公众号网站制作网页,微信公众号怎么制作?  油猴 教程,油猴搜脚本为什么会网页无法显示?  广州营销型建站服务商推荐:技术优势与SEO优化解析  Android使用GridView实现日历的简单功能  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  网站好制作吗知乎,网站开发好学吗?有什么技巧?  c# 服务器GC和工作站GC的区别和设置  网页设计网站制作软件,microsoft office哪个可以创建网页?  为什么Go需要go mod文件_Go go mod文件作用说明  seo网站制作优化,网站SEO优化步骤有哪些?  网站制作网站,深圳做网站哪家比较好?  建站之星安装提示数据库无法连接如何解决?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何快速搭建自助建站会员专属系统?  建站之星客服服务时间及联系方式如何?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  ,在苏州找工作,上哪个网站比较好?  网站制作价目表怎么做,珍爱网婚介费用多少?  广东企业建站网站优化与SEO营销核心策略指南  c++怎么用jemalloc c++替换默认内存分配器【性能】  小建面朝正北,A点实际方位是否存在偏差?  外贸公司网站制作哪家好,maersk船公司官网?  建站之星如何防范黑客攻击与数据泄露?  如何在万网自助建站平台快速创建网站?  建站上传速度慢?如何优化加速网站加载效率?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  建站之星代理平台如何选择最佳方案?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  免费视频制作网站,更新又快又好的免费电影网站?  建站之星导航配置指南:自助建站与SEO优化全解析  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何通过可视化优化提升建站效果?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  如何在云主机上快速搭建多站点网站?  建站上市公司网站建设方案与SEO优化服务定制指南  香港服务器建站指南:免备案优势与SEO优化技巧全解析  如何在景安云服务器上绑定域名并配置虚拟主机?  电商网站制作价格怎么算,网上拍卖流程以及规则?  TestNG的testng.xml配置文件怎么写  如何快速生成ASP一键建站模板并优化安全性?  如何选择香港主机高效搭建外贸独立站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。