javascript(类java)哈希码实现

2024-02-22

以下代码是我对相当通用的 javascript 哈希代码实现的尝试。我计划将此代码与哈希表实现(例如 jshashtable)结合使用,该哈希表实现使用 hashCode()(如果为键定义)。我尝试严格遵守 java 的数字、字符串和数组的哈希码实现。

问题:

  • 此实现在正确性方面是否存在任何问题 还是性能?
  • 是否有任何预先存在的哈希实现 执行相同(或大致相同)操作的代码?
  • 除了 jshashtable,还有其他利用的哈希表实现吗 hashCode() 和 equals() 以同样的方式我也应该考虑?

注意:我知道下面的代码可以利用其他库,例如下划线和 jquery,但我不希望在我的实现中使用任何第三方依赖。这并不是说我对哈希码库不感兴趣,它们本身可能依赖于 jquery、下划线等。

/**
* Computes a hash code for an object based on a given subset of its fields 
* @param obj any type
* @param keys an array of strings representing some subset of the keys in obj or undefined
* @returns {Number} a java-like hash code for obj based on the hash codes of a subset of its fields
*           specified in keys.
*/
function hashCode(obj, keys) {

   if (!isDefined(keys)) return typeHashCode(obj);

   var result = 1;
   for (var k = 0; k < keys.length; k++) {
      var key = keys[k];
      if (isDefined(obj[key]))
        result = multiplyBy31AndAdd(result, typeHashCode(obj[key]));
   }

   return result;
}

/**
 * @param obj
 * @returns {Number}
*/
function typeHashCode(obj) {
   var result = 1;
   if (isDefined(obj)) {
      if (typeof obj === 'string') 
         result  = multiplyBy31AndAdd(result, stringHashCode(obj));
      else if (typeof obj === 'number' && isFinite(obj)) 
         result  = multiplyBy31AndAdd(result, numberHashCode(obj));
      else if (typeof obj === 'object') {
         if (nonEmptyObject(obj)) {
            if (isDefined(obj[hashCode])) 
                result = multiplyBy31AndAdd(result, obj.hashCode());
            else {
                if (Array.isArray(obj)) 
                    result = multiplyBy31AndAdd(result, arrayHashCode(obj));
                else { 
                    //This is what jshashtable does. If there were an easy and agreed upon way
                    //of uniquely identifying objects in javascript, a better approach
                    //may be to use the object's id
                    result  = multiplyBy31AndAdd(result, stringHashCode(obj.toString()));
                }
            }
        }
      }
   }
   return result;
}

/**
 * Generates a hash code for a 64 bit floating point number, similar to java's hash 
 * code implementation. This does not handle NaN and Inf the same way as java. 
 * More info can be found at [1]
 * [1] http://stackoverflow.com/questions/2003493/javascript-float-from-to-bits
 * @param num a finite number as defined by isFinite()
 * @returns {Number}
*/
function numberHashCode(num) {
   var buf = new ArrayBuffer(8);
   (new Float64Array(buf))[0] = num;
   return (new Uint32Array(buf))[0] ^ (new Uint32Array(buf))[1];    
}

/**
 * Generates a hash code for a string, similar to java's hash code 
 * implementation. More info can be found at [1]
 * [1] http://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript-jquery
 * @returns {Number}
 */
function stringHashCode(str) {
   var hash = 0;
   if (str.length === 0) return hash;
   for (var i = 0; i < str.length; i++) {
     var character  = str.charCodeAt(i);
     hash  = multiplyBy31AndAdd(hash, character);
   }
   return hash;
}

/**
 * @param array
 * @returns {Number} hash code for the array
*/
function arrayHashCode(array) {
   var result = 1;
   for (var i = 0; i < array.length; i++) {
     result = multiplyBy31AndAdd(result, typeHashCode(obj));
   }
   return result;
}

/**
 * Code taken from:
 * http://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript-jquery
 * @param currentValue a number
 * @param toAdd a number
 * @returns {Number} the 32 bit integer representation of 31 * currentValue + toAdd
*/
function multiplyBy31AndAdd(currentValue, toAdd) {
   var rv = ((currentValue<<5)-currentValue)+toAdd;
   return rv & rv; //Convert to 32 bit integer
}


function isDefined(obj) {
   return !(obj === undefined || obj === null);
}

/**
 * Taken from http://stackoverflow.com/questions/4994201/is-object-empty
 * @param obj an object
 * @returns {Boolean} obj is {}
*/
function nonEmptyObject(obj) {
   return !(Object.keys(obj).length === 0);
}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javascript(类java)哈希码实现 的相关文章

随机推荐

  • C++11“重载 lambda”,带有可变参数模板和变量捕获

    我正在研究一个 C 11 习惯用法 它可能被称为 重载 lambda http cpptruths blogspot com 2014 05 fun with lambdas c14 style part 2 html http cpptr
  • 无法通过 Unity 在 Android 上启动活动

    我正在使用 Unity 创建 Android 应用程序 我有两个插件 每个单独工作都很好 但是当我想要同时使用它们时 我无法在它们之间切换活动 在过去的十天里 我阅读了所有类似的问题 并尝试了从反编译 编辑 重新编译 Java 代码到从 U
  • 设置辅助功能上的窗口级别

    我正在开发一个 Mac OS X 应用程序 它操纵属于另一个应用程序的窗口 我为此使用辅助功能 我已经成功移动窗口并从我的应用程序查询其属性 现在我需要使窗口 始终位于顶部 基于另一个帖子 https stackoverflow com q
  • Java (JSP):在“子 jsp”中重复 contentType 标头

    当一个 jsp 中的标头重复包含在另一个 jsp 中时会发生什么情况 例如如果示例 jsp以此开始
  • 在不带“with”的情况下对 data.table 进行键控查找

    我有一个data table像这样的结构 除了我的真的很大 dt lt data table x 1 5 y 3 7 key x 我想通过以下方式查找该结构中的行another名称为的变量x 注意 与密钥的名称相同dt x lt 3 4 d
  • Google 日历 API 和 OAuth 问题

    我收到错误 com google gdata util AuthenticationException Unknown authorization header at com google gdata client http HttpGDa
  • 使用 Node.js 进行 Javascript 异步异常处理

    我目前正在开发一个 Node js 应用程序 并且遇到了常见的异步代码问题 我正在 Node 的 HTTP 模块之上实现一个服务服务器 该服务器支持 类似express 路由 例如 我的代码如下所示 server any someRoute
  • 使用掩码验证 IP 的 HTML5 模式

    我正在尝试为输入文本创建一个 HTML5 模式 其中包含 IP 地址和掩码 如下所示 10 120 15 30 28 或 172 181 30 0 24 我发现了一种 html5 模式http html5pattern com Miscs
  • 在多处理器机器上执行 C++ 程序

    我出于研究目的用 C 开发了一个程序 需要几天时间才能完成 现在我在我们的实验室 8 核服务器机器上执行它以快速获得结果 但我看到机器只为我的程序分配一个处理器 并且它的处理器使用率保持在 13 即使我将进程优先级设置为高级别并与 8 核相
  • 如何将edittext中的数据存储到android sqlite数据库中?

    我是 Android 的新开发人员 我想使用 sqlite 将用户数据存储在数据库中 对于该设计 xml 文件用户名作为 edittext 并采用按钮 在填写所有文本字段后 单击按钮时所有数据都存储在数据库中 并在屏幕上显示这些数据 这些都
  • 从不同文件夹渲染部分(不共享)

    如何让视图从不同的文件夹渲染部分 用户控件 在预览版 3 中 我曾经使用完整路径调用 RenderUserControl 但升级到预览版 5 后 这不再可能了 相反 我们得到了 RenderPartial 方法 但它没有提供我正在寻找的功能
  • QLDB 中的分页

    我注意到 QLDB 不支持LIMIT or SKIP实现基本分页所需的查询参数 将来是否会支持此功能 或者是否有其他方法在 QLDB 中实现分页 目前不支持 LIMIT SKIP QLDB 专为数据摄取而构建 我们建议在另一个专门构建的数据
  • 最佳 MySQL 配置 (my.cnf)

    以下是我的默认生产MySQL配置文件 my cnf 用于以 InnoDB 作为默认存储引擎的纯 UTF 8 设置 server bind address 127 0 0 1 innodb file per table default cha
  • 在 PHP 中使用另一个条件的变量

    我有这个代码 if isset GET act display gt display templates install main html if isset POST proceed prefix POST prefix if GET a
  • 使用@Transactional和Spring模板有什么区别?

    如果我在 DAO 中使用 Transactional 我的所有 EntityManager 查询是否都会通过提交和关闭进行封装 或者我需要使用Spring模板 JPA模板 Hibernate模板 使用 Transactional和Sprin
  • 使用 Genymotion 和 Charles 进行 SSL 代理?

    我正在尝试让 Genymotion Virtualbox 中托管的 x86 Android 模拟器 与 Charles 代理一起使用 我已成功使用网关 ip 虚拟机配置为使用仅主机适配器 fwiw 将设备连接到设备 wifi 代理设置中的代
  • 从 Excel 单元格读取十进制值(在 C# 中)

    从包含小数的 Excel 单元格读取值时 我遇到以下问题 如果我在 Excel 的单元格中输入 9 95 CellValue InnerText在 C 中返回 9 9499999999999993 我怎样才能获得输入的实际值 即 9 95
  • 使用 geotools api 在 WGS84 crs 中线段和点之间的最短距离

    在geotools中 您可以使用Geometry类中的距离函数找到两个几何图形之间的距离 几何有一个点子类 但没有几何的线段子类 然而 有一个 LineSegment 类派生自 LineString 它不是 Geometry 类的子类 我尝
  • JAX-RS 非常适合实现 REST。在 Java 中使用什么来调用 REST 服务? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 理想情况下 我正在寻找类似 JAX RS 的东西 使用注释来描述我想要调用的服务 但允许调用使用其他技术 不是 JAX RS 实现的 RE
  • javascript(类java)哈希码实现

    以下代码是我对相当通用的 javascript 哈希代码实现的尝试 我计划将此代码与哈希表实现 例如 jshashtable 结合使用 该哈希表实现使用 hashCode 如果为键定义 我尝试严格遵守 java 的数字 字符串和数组的哈希码