我现在有一个手头的项目,使用Hashcode作为字符串的主键,现在字符串的数目激增,我需要知道,这些Hashcode在多大可能内重复?PS这些字符串都是规则的小写URL,例如http://www.csdn.net
这样的字符串大约有10万余个,如果重复的个数是两位数个是可以接受的。

解决方案 »

  1.   

    以下是java.lang.String的原代码:
    public int hashCode() {
    int h = hash;//默认0
    if (h == 0) {
        int off = offset;//默认0
        char val[] = value;//字符串是用字符数组表示的.
        int len = count;//字符串长度
                for (int i = 0; i < len; i++) {
                    h = 31*h + val[off++];
                }
                hash = h;
            }
            return h;
     }
    他返回的是一个int类型的数据,而int的最大值是2147483647,你的是10w个字符串,机会应该很小,再说java本身应该会通过某种散列算法减少冲突的.
      

  2.   

    使用Hashcode作为字符串的主键?我想hashcode不是用来生成唯一键的,而是让某个数量级的无顺序的对象,能够用最快的速度找到,而且不占用太多的内存空间。象数据库那样不允许重复的,不适合用hashcode。 多大的重复度合适,得看应用和对象的总数量了。每个hashcode 等同于一个小屋,里面可以放多个对象,他们的hashcode相同。而唯一键,代表每个人都分配了一个小屋,全部是单间。个人理解,仅供参考。
      

  3.   

    Hashcode作为字符串的主键? 我想hashcode不是用来生成唯一键的,而是让某个数量级的无顺序的对象,能够用最快的速度找到,而且不占用太多的内存空间。 象数据库那样不允许重复的,不适合用hashcode。 多大的重复度合适,得看应用和对象的总数量了。 每个hashcode 等同于一个小屋,里面可以放多个对象,他们的hashcode相同。而唯一键,代表每个人都分配了一个小屋,全部是单间。 个人理解,仅供参考。
      

  4.   

    10w个字符串的话重复的几率是比较小的…… 顺便讲个重复的例子
       Integer对象的hashcode等于该对象的int值;
       任意一个string,取得他的hashcode X,
       Integer a = X;
    那么a和原string的hashcode就是相等的;