Java String中的hashCode函数 以BKDR Hash Function实现

哈希表原理、实战与高级应用全解析 哈希表作为数据结构与算法中的核心组件,通过哈希函数将键映射到存储位置实现高效数据存取。其核心原理包括哈希函数设计、冲突解决策略(如链地址法、开放寻址法)等关键技术。在工程实践中,哈希表广泛应用于缓存系统、数据库索引、唯一性校验等场景,特别是在算法竞赛和大数据处理中表现突出。通过BKDR等优质哈希函数和布隆过滤器等衍生结构,可以显著提升系统性能。本文结合LeetCode高频题型和电商系统实战案例,深入探讨哈希表在索引映射、频次统计等场景的最佳实践,并分析其在密码学安全、分布式系统等高级领域的创新应用。 阅读详情

String 类中的hash函数如下:

    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;
    }

 

 

具体的计算公式是:s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

 

 

上面的代码可见简洁和高效。JDK的源代码。

 

这个hash算法的名称叫:BKDR Hash Function

 

This hash function comes from Brian Kernighan and Dennis Ritchie's book "The C Programming Language". It is a simple hash function using a strange set of possible seeds which all constitute a pattern of 31....31...31 etc, it seems to be very similar to the DJB hash function.

 

算法来自于Brian Kernighan and Dennis Ritchie合著的C语言编程一书。函数用一个特殊的种子集合构建哈希函数

 

该算法代码:

   public long BKDRHash(String str)
   {
      long seed = 131; // 31 131 1313 13131 131313 etc..
      long hash = 0;

      for(int i = 0; i < str.length(); i++)
      {
         hash = (hash * seed) + str.charAt(i);
      }

      return hash;
   }
   /* End Of BKDR Hash Function */

 

参考路径:http://www.partow.net/programming/hashfunctions/index.html

Java编程String 类中 hashCode() 方法详解 hash 的定义Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数Java 阅读详情

相关推荐

【Matlab】多旋翼无人机视觉伺服跟踪控制程序

本文介绍了基于Matlab的多旋翼无人机视觉伺服跟踪控制程序开发方法。该系统采用视觉感知、坐标转换、伺服控制和仿真验证四个核心模块,通过HOG+SVM目标检测、Shi-Tomasi特征提取和PID双闭环控制算法实现动态目标跟踪。详细阐述了相机标定、目标检测、坐标转换及伺服控制等关键环节的Matlab实现代码,并进行了仿真验证。结果表明该系统在±0.1m的跟踪精度下可实现100Hz的实时处理,适用于室内外复杂场景。文章还提出了工程应用中的优化建议,为无人机视觉伺服系统的开发提供了完整的技术方案。

unber的博客 485

Java String中的hashCode函数

String中的hash函数如下:     public int hashCode() { int h = hash; if (h == 0) {     int off = offset;     char val[] = value;     int len = count;             for (int i = 0; i &lt; len; i++) {         ...

勇敢的心-braveheart 269

RT-DETR模型应用过程中的报错处理及疑问解答,涉及环境搭建、模型训练、模块改进、论文写作

本文记录了RT-DETR模型的这一系列过程中可能发生的问题,以及大家非常关心的问题,这里统一做了一个记录和解答。

Limiiiing的博客 1697

JavaString类型的hashCode实现

hash、散列值,是把任意长度的输入,通过散列函数变换成固定长度的输出,这种转换是一种压缩映射,散列值的长度通常远小于输入的长度,可以看做是摘要或特征值,不同的输入有可能会得到相同的hash。...............

CaptainCats的博客 1689

JavaString类的hashCode()方法

相同的字符串调用hashCode()方法,得到的值是一样的,与内存地址、进程、机器无关。String类的hashCode()方法的源码如下: public int hashCode() { int h = hash; // 默认值是0 if (h == 0 && value.length > 0) { char val[] = value; /...

werewolf2017的博客 2万+

关于JavaString类的hashCode方法

计算方法: /** * Returns a hash code for this string. The hash code for a * &lt;code&gt;String&lt;/code&gt; object is computed as * &lt;blockquote&gt;&lt;pre&gt; * s[0]*31^(n-1) + s[1]...

caijunliyanqing的专栏 648

java hashCode详解

hashCode就是我们所说的散列码,使用hashCode算法可以帮助我们进行高效率的查找,例如HashMap,我在前面的文章有介绍过,这里就不再啰嗦了。说hashCode之前,先来看看Object类。 我们知道,Object类是java程序中所有类的直接或间接父类,处于类层次的最高点。在Object类里定义了很多我们常见的方法,包括我们要讲的hashCode方法,如下   publ...

Later equals never. 444

一文说透StringhashCode

关于String类的hashCode方法,网上已经有很多文章,他们大多讲解的都是基于以下代码: public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i];

帝上无天的博客 9177

详细介绍JavaString类的hashCode()方法

用来计算字符串对象的哈希码(hash code)。更简单来讲就是怎么把一个字符变成一个数字,因为只有数字才能在数据结构中进行处理。

weixin_73273374的博客 1032

String源码中的hashCode算法

学习String源码中的hashCode算法目录1.hashCode的作用2.了解二进制计算符3.String源码hashCode算法实现 目录 1.hashCode的作用 2.了解二进制计算符 << : 左移运算符,num << 1,相当于num乘以2 低位补0 >> : 右移运算符,num >> 1,相当于num除以2 高位补0 >>> : 无符号右移,忽略符号位,空位都以0补齐 % : 模运算 取余 ^ : 位异或 第一个

qicha3705的博客 2660

String.hashCode()方法

hashCode() 方法用于返回字符串的哈希码。 字符串对象的哈希码根据以下公式计算: s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 所以相同的参数去获取hashCode时,获取到的hash值是一样的。

一片蓝蓝的云 1867

正确重写hashCode方法

例一: import java.util.List; public class Dish { private String dishCode; private boolean weighing; private String categoryCode; private boolean currentPrice; privat...

HD243608836的博客 1万+

BKDRHash 算法java实现

背景: BKDRHash算法是字符串hash算法。是一种简单快捷的hash算法java的继承Object类的提供的hashCode()函数也是采用这种hash算法。下面使用100000个不同字符串产生的冲突数,大概在0~3波动,使用100百万不同的随机数,冲突数大概110+范围波动。import java.util.HashMap; import java.util.Map; import ja

喜欢吃一口烤肉的啵啵 4909

Java BigDecimal hashCode()方法与示例

BigDecimal类hashCode()方法 (BigDecimal Class hashCode() method) hashCode() method is available in java.math package. hashCode()方法在java.math包中可用。 hashCode() method is used to get the hash code value for ...

cumubi7552的博客 389

String类的hashCode()方法源码分析

编译期间,字符串的最大长度不能超越65535个字节,即编译期间的String字符串的最大长度为65534个字节,不然就会编译报错。运行期间,String的最大长度就要看Integer.MAX_VALUE的值了,即:2^31 - 1个字节。不管怎样,String的最大长度就不能超过虚拟机当前最大内存设置。

weixin_53622554的博客 2036

字符串哈希(BKDR_Hash)

详讲BKDR_Hash,并用C语言实现简版代码

日常记录,挨打要立正! 9737

javahashCode 与 equals (重要)

方法的主要作用是为对象生成一个哈希码,用于散列算法中快速查找对象。是用于对象比较的重要方法。的默认实现是基于对象的内存地址生成的,因此不同的对象即使内容相同,也可能生成不同的哈希码。之间的约定,确保对象在逻辑上相等时它们的哈希码也相同,是确保程序正确性和高效性的关键。方法是比较两个对象的引用(即内存地址),只有当两个对象是同一个实例时才返回。的默认实现是基于对象的内存地址的比较,因此如果两个对象的引用相同,类中的方法,它用于比较两个对象的内容是否相同。是两个不同的对象,因此它们的哈希码也不同。

Flying_Fish_roe的博客 1744

JAVA学习-hash算法

Hash   Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。根据散列值作为地址存放数据,这种转换是一种压缩映射,简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。查找关键字数据(如K)的时候,若结构中存在和关键字相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。我们称这个对应关系f为散列函数(Hash function),按这个事件建立的表为散列表。   综上所述,根据散列

qq_48772498的博客 3352

口腔数据集图像分割数据集,已标注

口腔数据集图像分割数据集,已标注 0: abdominal_wall 1: colon 2: inferior_mesenteric_artery 3: intestinal_veins 4: liver 5: pancreas 6: small_intestine 7: spleen 8: stomach 9: ureter 10: vesicular_glands

上一篇: 各种字符串Hash函数比较
下一篇: shell命令trap用法
diana_cherry
博客等级 码龄19年 16粉丝 37原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值