今天有同事提议用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重复

原文链接:http://www.cnblogs.com/steeven/archive/2005/03/24/124493.html

转载于:https://blog.51cto.com/developerycj/1922024

hashcode重复可能性探究相关推荐

  1. String.hashCode 哈希值出现重复?

    String.hashCode重复 在我学习hash的时候,没有按照教程里面的字符串的值去获取了一个hashcode,然后让这个小白的我惊讶了,这个竟然和教程里面的那个不一样, 对此,我对于这个问题进 ...

  2. Excel如何快速生成不重复随机整数

    日常工作中我们经常会遇到要生成随机数的情况,比如分考场.分班级.抽样.抽奖等等.下面就给大家介绍一下如何生成不重复随机数. 一.工具法 1.如下图是某学校考试座次表,姓名列已经完成,现在我们要在座次列 ...

  3. 重写hashcode,玩儿坏HashMap

    重写hashcode,玩儿坏HashMap 缘起 提到HashMap,都知道"线程不安全,并发情况下不能用",除此之外貌似了解的不是很多. 对,我就是其中一员. 这两天跟两个开发大 ...

  4. 蚂蚁一面:hashCode 和对象的内存地址有什么关系?

    前言 先看一个最简单的打印 System.out.println(new Object()); 会输出该类的全限定类名和一串字符串: java.lang.Object@6659c656 @符号后面的是 ...

  5. 从数组到 HashMap 之算法解释

    一.数组是什么? 忘了在哪本书里曾看到过类似这样的一句话"所有的数据结构都是数组的演化",想想其实是有道理的,因为计算机的内存其实就是线性的存储空间. Java示例代码:int[] ...

  6. java面试看这一篇就够了

    由于最近比较忙,项目赶的比较紧所以一直没有更新整理面试题,这次抽了些时间把答应大家的面试题整理出来了感谢各位小伙伴们的支持,你们的支持是我分享的动力,希望在以后的日子里咱们共同学习进步.如果感觉不错就 ...

  7. 集合框架——Set集合的使用与数据结构详解

    Set集合 特点:无序,无下标,元素不可重复 方法:全部继承自Collection中的方法 不包含重复元素的集合. 更正式地,集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多 ...

  8. python 打乱数组顺序,Python打乱二维数组顺序:个人使用经历

    目录 我的需求背景: 发现问题: 解决方式: 我的需求背景: 两个分类标签的数据独立成组,使用np.vstack拼接到一起后,希望打乱行的顺序. #合并SD和USD标签的数据 finalData = ...

  9. 开放地址法实现HashTable

    前注:本文不是讲解Java类库的Hashtable实现原理,而是根据计算机哈希表原理自己实现的一个Hashtable. HashTable内部是用数组存放一个(Key-Value pair)键值对的引 ...

最新文章

  1. 快照速度_网络推广——网络推广专员如何看待网站快照更新快慢问题?
  2. Linux日志文件总管——logrotate
  3. 图片在section上下居中_新媒体运营者关于图片使用的几大要点
  4. 剑指Offer值数字在排序数组中出现的次数
  5. flask before_request after_request
  6. C++--第8课 - 类中的封装
  7. Java Web三大组件
  8. 铁路cj继电器_铁路信号继电器简介讲解
  9. VM189:1 Uncaught SyntaxError: Unexpected token o in JSON at position 1
  10. 珍珠项链(洛谷-P2768)(Dp矩阵加速)
  11. linux安全审计和加固工具-lynis
  12. Android 適配器的回調
  13. codeblock找不到pthread
  14. muduo实现finger服务
  15. OCR文字识别 少数民族文字识别 国外文字识别
  16. QT 记住账号密码登录
  17. QQ音乐关键字搜索并生成下载url
  18. 计算机视觉产品推荐,个性化推荐:人工智能中的计算机视觉、NLP自然语言处理和个性化推荐系统哪个前景更好一些?...
  19. 042-16 Backup and Recovery备份与恢复(前3种备份方式)
  20. OSChina 周五乱弹 —— 破手机比 2080ti 核动力煤气灶还贵

热门文章

  1. 22.25在计算机中如何储存,浮点数在计算机中存储方式
  2. c++ opencv 照片清晰度_opencv新手学习————素描视频(C++)
  3. xcode怎么打flutter的release包啊_“打工人”梗刚刚爆红网络,“早安打工人”等已被注册商标...
  4. java有main却说找不到_小说:女子雨夜找扳指,男子却说你找不到的:我没丢怎么也找到...
  5. IC/FPGA笔试/面试题分析(八)近期IC/FPGA笔试面试讨论群题目汇总解析
  6. 【Verilog HDL 训练】第 07 天(串并转换)
  7. Alpha阶段事后分析
  8. 实验long raw 和 blob两种数据类型遇到dblink的表现
  9. 【SharePoint】设置站点通讯组
  10. 掌握 Linux 调试技术【转】