`
zhhphappy
  • 浏览: 121333 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

javascript 实现 java 中String的hashcode方法

 
阅读更多

javascript中有需要用到像类似java中的hashcode方法,想把java中的hashcode方法直接搬到js中发现不行

/**
     * Returns a hash code for this string. The hash code for a
     * <code>String</code> object is computed as
     * <blockquote><pre>
     * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
     * </pre></blockquote>
     * using <code>int</code> arithmetic, where <code>s[i]</code> is the
     * <i>i</i>th character of the string, <code>n</code> is the length of
     * the string, and <code>^</code> indicates exponentiation.
     * (The hash value of the empty string is zero.)
     *
     * @return  a hash code value for this object.
     */
    public int hashCode() {
	int h = hash;
        int len = count;
	if (h == 0 && len > 0) {
	    int off = offset;
	    char val[] = value;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }

 关键是hash的类型是int,int的范围是MIN_VALUE = 0x80000000; MAX_VALUE = 0x7fffffff;

这样在执行

h = 31*h + val[off++];

 的时候当超有可能超过int的最大值,变成负数。但js里面是不区分int,long的直接显示,显示不下用科学技术法,所以需要一个模拟java中int超出范围变负数的方法。

最终的实现如下:

function isNull(str){
		return str == null || str.value == "";
	}
	
	/**
	 * java String hashCode 的实现
	 * @param strKey
	 * @return intValue
	 */
	function hashCode(strKey)
	{
		var hash = 0;
		if(!isNull(strKey))
		{
			for (var i = 0; i < strKey.length; i++)
			{
				hash = hash * 31 + strKey.charCodeAt(i);
				hash = intValue(hash);
			}
		}
		return hash;
	}

	/**
	 * 将js页面的number类型转换为java的int类型
	 * @param num
	 * @return intValue
	 */
	function intValue(num)
	{
		var MAX_VALUE = 0x7fffffff;
		var MIN_VALUE = -0x80000000;
		if(num > MAX_VALUE || num < MIN_VALUE)
		{
			return num &= 0xFFFFFFFF;
		}
		return num;
	}
分享到:
评论

相关推荐

    javascript中实现兼容JAVA的hashCode算法代码分享

    从给定文件中,我们可以提取以下知识点: ...通过以上知识点的详细说明,我们可以更深入地理解如何在JavaScript中实现一个与Java中实现兼容的hashCode算法,并且理解这个算法在实际应用中的价值和潜在的性能优化考虑。

    hash-generator-js:一个Vue.js应用程序,其中包含Java中String类的hashCode方法的javascript实现

    哈希生成器js 一个Vue.js应用程序,其中包含Java中String类的hashCode方法的javascript实现构建设置# install dependenciesnpm install# serve with hot reload at localhost:8080npm run dev# build for production...

    string-hashcode:java.lang.String.hashCode

    安装npm install string-hashcode 例子var hashCode = require ( 'string-hashcode' ) ;var s = 'abc' ;console . log ( s . hashCode ) ; // undefinedvar code = hashCode ( s ) ;console . log ( s . hashCode ) ...

    Java中使用JavaScript脚本的方法步骤

    这意味着在JavaScript脚本中可以调用Java对象的方法,以及在Java程序中可以执行JavaScript函数,并获取其返回值。 使用JavaScript脚本在Java中的基本步骤可以概括如下: 1. 编写JavaScript脚本:首先,需要编写...

    JAVA中常用类的常用方法.docx

    JAVA 中有许多常用的类,每个类都有其特定的方法,本文将对 java.lang.Object 类、String 类和 StringBuffer 类的常用方法进行讲解。 一、java.lang.Object类 java.lang.Object 类是 JAVA 中所有类的父类,它提供...

    java API帮助文档

    Java API中的核心类如`Object`、`String`、`Integer`等是所有Java类的基类,它们定义了一些基本的操作,如`equals()`用于比较对象是否相等,`toString()`用于将对象转化为字符串,以及`hashCode()`用于实现哈希表的...

    【牛客网】Java开发校招面试考点汇总(附面试题和答案).pdf

    - 值传递与引用传递的区别:Java中方法参数的传递总是值传递,引用类型的值是对象引用的拷贝。 4. Java集合框架 - ArrayList与数组的区别:ArrayList是动态数组实现,大小可变;数组大小固定。 - 大O符号:表示...

    获取字符串的哈希-JavaScript开发

    与Java的String#hashCode()类似。 安装$ npm install @ sindresorhus / string-hash用法const stringHash string-hash获取字符串的哈希值使用非加密哈希函数FNV-1a。 与Java的String#hashCode()类似。 安装$ ...

    java常用util工具类

    最后,`ObjectUtil`工具类通常包含一些通用的面向对象的辅助方法,例如,`equals()`和`hashCode()`的实现可以帮助我们快速比较两个对象是否相等,`clone()`可以实现对象的浅拷贝或深拷贝,`isNull()`和`isNotNull()`...

    Java课程介绍.pdf

    Java中的Object类是所有类的根类,覆盖了equals(), hashCode(), toString()等方法,为Java对象提供了通用的行为。static关键字和final关键字也是Java面向对象编程中的重要概念,分别用于定义类变量和常量。 集合...

    千方百计的面试题

    Java中实现多态的机制是通过继承和接口实现,一个类被声明为final类型,表示该类不能被继承。 ArrayList和Vector都是实现了List接口的集合类,但Vector是同步的,而ArrayList不是。关于使用assert的时机,它主要...

    java复习题总结.docx

    在Java中,当你重写`equals()`方法时,通常也需要重写`hashCode()`。这是因为`hashCode()`用于哈希表(如`HashMap`)的高效查找。当两个对象通过`equals()`比较相等时,它们的`hashCode()`也应该相等,以确保正确地...

    IT java 面试题库

    2. **如何在java中实现文本文件和二进制文件的copy?** - 对于文本文件,可以使用`BufferedReader`和`BufferedWriter`;对于二进制文件,可以使用`FileInputStream`和`FileOutputStream`。 #### 八、JDBC 1. **...

    一套完整的java面试题

    1. 作用域:在Java中,public、private、protected和默认的作用域分别代表了不同的访问级别。public允许任何地方访问,private仅限于本类内部,protected允许同包及子类访问,而默认作用域(无修饰符)只允许同包内...

    java项目开发总结.docx

    Java 项目开发总结是指在 Java 项目开发中所需具备的基本知识点和技能。以下是 Java 项目开发总结的详细知识点: 一、基本语法和数据类型 * int、long、Integer、Long 等基本数据类型 * 操作符、if、else 语句、...

    java 面试宝典 免费提供

    - 多态是通过继承和接口实现的,允许子类重写父类方法,或者实现接口中的方法。 #### 四十一、声明为`final`类型的含义 - `final`关键字用于声明不可变的类、方法或变量。 - `final`类不能被继承,`final`方法不能...

    Java进阶路线

    Java中的输入/输出操作通过流实现。理解 File、FileInputStream、FileOutputStream 等基本类对于文件操作非常重要。 **12. Collection & Array** 数组和集合都是用来存储多个元素的数据结构。了解它们之间的区别和...

    JAVA 208道面试题.pdf

    - **equals方法**:在Object类中,equals默认实现也是基于==运算符来比较引用的,即比较两个引用是否指向同一个对象。但String、Integer等类重写了equals方法,使得它们比较的是值而非引用。因此,对于String和...

    海联讯科技Java面试题.doc

    - DWR允许JavaScript与Java服务器端进行实时交互,实现AJAX功能。 20. **JSP基础配置** - JSP页面需要引入Servlet API、JSP API等相关jar包。 21. **Hibernate ID生成策略** - Hibernate提供了多种ID生成策略,...

    java快速学习笔记(已有基础)

    `equals()`是Object类的方法,通常在子类中重写以实现内容的比较,如Integer和String类。 7. **toString()**: - 默认的`toString()`返回对象的内存地址,但通常会重写以返回更有意义的信息,如对象的属性。 8. *...

Global site tag (gtag.js) - Google Analytics