全网整合营销服务商

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

免费咨询热线: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 


相关文章: linux top下的 minerd 木马清除方法  如何确保西部建站助手FTP传输的安全性?  建站与域名管理如何高效结合?  如何快速搭建支持数据库操作的智能建站平台?  如何用PHP快速搭建高效网站?分步指南  如何通过可视化优化提升建站效果?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  独立制作一个网站多少钱,建立网站需要花多少钱?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  阿里云网站制作公司,阿里云快速搭建网站好用吗?  兔展官网 在线制作,怎样制作微信请帖?  建站之星如何保障用户数据免受黑客入侵?  网站制作员失业,怎样查看自己网站的注册者?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  建站10G流量真的够用吗?如何应对访问高峰?  如何用搬瓦工VPS快速搭建个人网站?  如何通过虚拟主机快速完成网站搭建?  如何续费美橙建站之星域名及服务?  深圳网站制作的公司有哪些,dido官方网站?  网站制作免费,什么网站能看正片电影?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  如何快速搭建高效WAP手机网站吸引移动用户?  建站之星代理如何获取技术支持?  已有域名如何免费搭建网站?  如何通过主机屋免费建站教程十分钟搭建网站?  如何在西部数码注册域名并快速搭建网站?  如何构建满足综合性能需求的优质建站方案?  家庭服务器如何搭建个人网站?  如何用低价快速搭建高质量网站?  建站之星如何实现PC+手机+微信网站五合一建站?  制作网站的模板软件,网站怎么建设?  定制建站如何定义?其核心优势是什么?  网站企业制作流程,用什么语言做企业网站比较好?  盘锦网站制作公司,盘锦大洼有多少5G网站?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  免费ppt制作网站,有没有值得推荐的免费PPT网站?  建站主机CVM配置优化、SEO策略与性能提升指南  c# 在ASP.NET Core中管理和取消后台任务  javascript中的try catch异常捕获机制用法分析  香港服务器租用费用高吗?如何避免常见误区?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  如何通过FTP服务器快速搭建网站?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  如何在万网开始建站?分步指南解析  青浦网站制作公司有哪些,苹果官网发货地是哪里?  广州建站公司哪家好?十大优质服务商推荐  如何选择域名并搭建高效网站?  成都响应式网站开发,dw怎么把手机适应页面变成网页? 

您的项目需求

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