function hashCode(str){
var h = 0, off = 0;
var len = str.length;
for(var i = 0; i < len; i++){
var tmp=str.charCodeAt(off++);
h = 31 * h + tmp;
if(h>0x7fffffff || h<0x80000000){
h=h & 0xffffffff;
}
}
return h;
};
今天写js 的 hashmap 算法, 需要用到java里的hashcode 算法,这是一个native method,封装在dll 里面了,看不到c 源码, 所以带往上看了一下:发现还是有人研究过的,code 如下:
function hashCode(str){
var h = 0, off = 0;
var len = str.length;
for(var i = 0; i < len; i++){
h = 31 * h + str.charCodeAt(off++);
}
var t=-2147483648*2;
while(h>2147483647){
h+=t;
}
return h;
}
偶不知道这位仁兄为什么要去减两个单位的2^32,但是这种做法是很不效率的,随便拿了一个字符串"大案要案噶dfi13"试了一下,IE就卡住了,
我把着个算法转成java的后确是对的,并且把减两个单位的while去掉了,也是对的,
private static int newHash(String str){
int h = 0, off = 0;
int len = str.length();
for(int i = 0; i < len; i++){
h = 31 * h + str.charAt(off++);
}
return h;
}
我马上知道怎么回事了,那个仁兄是想把js 的最后结果换成整型,不过他这么做十分不严谨,
我改了下子,只去低32位就可以了,因为java里有类型自动转换,偶写的也是如此...这下肯定没问题了...
function hashCode(str){
str=str+"";
var h = 0, off = 0;
var len = str.length;
for(var i = 0; i < len; i++){
h = 31 * h + str.charCodeAt(off++);
if(h>0x7fffffff || h<0x80000000){
h=h & 0xffffffff;
}
}
return h;
};
分享到:
相关推荐
从给定文件中,我们可以提取以下知识点: ...通过以上知识点的详细说明,我们可以更深入地理解如何在JavaScript中实现一个与Java中实现兼容的hashCode算法,并且理解这个算法在实际应用中的价值和潜在的性能优化考虑。
在JavaScript中,`hashCode`函数的实现可以从Java的`hashCode()`方法中获取灵感,因为Java的实现是经过优化的,并且广泛应用于各种场景。 下面我们将详细讨论几种不同的`hashCode`实现方法: 1. **基础实现**: `...
- Java和JavaScript的区别:Java是一种静态类型语言,而JavaScript是动态类型语言;Java运行在虚拟机上,JavaScript通常在浏览器中运行。 - Java和PHP的区别:Java是一种面向对象的、跨平台的编程语言,而PHP是一...
Java中的Object类是所有类的根类,覆盖了equals(), hashCode(), toString()等方法,为Java对象提供了通用的行为。static关键字和final关键字也是Java面向对象编程中的重要概念,分别用于定义类变量和常量。 集合...
在Java中,当你重写`equals()`方法时,通常也需要重写`hashCode()`。这是因为`hashCode()`用于哈希表(如`HashMap`)的高效查找。当两个对象通过`equals()`比较相等时,它们的`hashCode()`也应该相等,以确保正确地...
**Hashcode/Hash算法**:理解哈希码的作用及其与对象相等性的关系。哈希算法在数据结构如HashMap中非常重要。 **Linux安装Tomcat等应用**:熟悉在Linux环境下安装部署服务器环境的过程。 **Maven/SVN**:了解这两...
在Java编程中,`Hashtable`是一个古老的容器类,属于`java.util`包,它提供了存储键值对(key-value pairs)的功能。哈希表(Hashtable)是一种数据结构,通过键来快速查找对应的值,它的核心原理是哈希算法。哈希...
根据提供的文档信息,以下是从标题、描述、标签和部分内容中...以上知识点涵盖了Java面试中常见的技术领域,包括但不限于项目经验分享、基本语法、数据结构与算法、多线程编程等方面,对求职者来说具有较高的参考价值。
它还包含一个可继承的 enum 类型、对多种嵌套的 Exception 类型的支持、对 java.util.Date 的增强以及用于构建方法的实用程序,例如自动生成 toString() 的结果、自动实现 hashCode() 和 equals() 方法、数组操作、...
3. **面向对象**:Java是面向对象的语言,包括类和对象的创建与销毁,equals()和hashCode()方法用于对象比较,以及枚举类型(enum)和接口的使用。枚举可以定义一组固定的常量,接口则用于定义规范,实现多态性。 4...
- DWR允许JavaScript与Java服务器端进行实时交互,实现AJAX功能。 20. **JSP基础配置** - JSP页面需要引入Servlet API、JSP API等相关jar包。 21. **Hibernate ID生成策略** - Hibernate提供了多种ID生成策略,...
Java作为一门广泛使用的编程语言,其笔试和面试题目往往涵盖了语法、面向对象设计、数据结构、算法、并发编程等多个方面。以下是对这些知识点的详细解析: 1. **基础语法** - **变量与数据类型**:Java有基本数据...
- Java接口更倾向于功能的组合,而C++虚类强调的是继承层次结构。 #### 三十六、`.java`文件与类 - 一个`.java`文件可以包含多个类,但只能有一个公共类,并且文件名需要与该公共类的名称一致。 #### 三十七、常用...
面向对象编程是Java语言的核心,其主要特征...最后,java和javascript虽然名字相似,但它们是完全不同的编程语言,一个用于后端开发,一个用于前端开发。在合适的地方使用assert来验证程序的正确性是一种好的编程实践。
### Java高频面试知识点详解 #### 一、Java基础 **1. JDK和JRE有什么区别?** - **JRE(Java Runtime Environment)**: 包含Java虚拟机(JVM)、Java核心类库和支持文件,是运行Java程序所需的基础环境。 - **JDK...
### Java面试问题汇总知识点 #### 1. Forward与Redirect的区别 - **Forward**:服务器端重定向,由服务器控制将请求转发到另一个资源。客户端浏览器地址栏不会改变,且只发送一次请求。这种方式效率较高,因为可以...