JavaScript 从实数和整数计算哈希码

标签 javascript html typescript

您好,我需要一个函数来根据数字(实数 double )和整数计算唯一整数。

尝试解释一下我正在用 javascript 开发 GIS 应用程序,并且我正在处理复杂的矢量对象,例如多边形(环中具有两个坐标的点对象数组)和线点数组。我需要快速算法来识别元素已更改它必须非常快,因为我的矢量对象是千点的集合。在 C# 中,我使用按位运算异或从坐标计算哈希码。

但是 javascript 将按位运算中的所有操作数转换为整数,但在以 C# 方式(二进制)应用按位之前,我需要将 double 转换为整数。在反射器中,我看到 c# 像这样从 double 计算哈希码,我需要尽可能快地在 javascript 中使用这个函数。

public override unsafe int GetHashCode() //from System.Double
{
    double num = this;
    if (num == 0.0)
    {
        return 0;
    }
    long num2 = *((long*) &num);
    return (((int) num2) ^ ((int) (num2 >> 32)));
}

示例:

var rotation = function (n) {
    n = (n >> 1) | ((n & 0x001) << 31);
    return n;
}

var x: number = 1;
var y: number = 5;

var hash = x ^ rotation(y); // result is -2147483645

var x1: number = 1.1;
var y1: number = 5;

var hash1 = x1 ^ rotation(y1); // result is -2147483645

示例结果不正确 hash == hash1

示例 2:使用字符串有正确的结果,但从字符串计算 Hash 很复杂,而且速度不够快。

    var rotation = function (n) {
        n = (n >> 1) | ((n & 0x001) << 31);
        return n;
    }

     var GetHashCodeString = function(str: string): number {
        var hash = 0, i, l, ch;
        if (str.length == 0) return hash;
        for (i = 0, l = str.length; i < l; i++) {
            ch = str.charCodeAt(i);
            hash = ((hash << 5) - hash) + ch;
            hash |= 0; // Convert to 32bit integer
        }
        return hash;
     }

    var x: number = 1;
    var y: number = 5;

    var hash = GetHashCodeString(x.toString()) ^ rotation(GetHashCodeString(y.toString()));
    //result is -2147483605
    var x1: number = 1.1;
    var y1: number = 5;

    var hash1 = GetHashCodeString(x1.toString()) ^ rotation(GetHashCodeString(y1.toString()));
   //result is -2147435090

Example2 结果是正确的 hash != hash1

有没有比将数字转换为字符串比从每个字符计算散列更快的方法?因为我的对象很大,用这种方式会耗费大量的时间和操作……

我尝试使用 TypedArrays 来做到这一点,但我没有成功。

非常感谢您的帮助

最佳答案

您好,我尝试使用 TypedArrays 从数字计算哈希码,结果很有趣。在 IE 中,性能在 Chrome 中提高 4 倍,在 FireFox 中提高 2 倍,这种方法等同于字符串版本...

var GetHashCodeNumber = function (n: number): number {
         //create 8 byte array buffer number in js is 64bit 
         var arr = new ArrayBuffer(8);

         //create view to array buffer
         var dv = new DataView(arr);

         //set number to buffer as 64 bit float  
         dv.setFloat64(0, n);

         //now get first 32 bit from array and convert it to integer
         // from offset 0
         var c = dv.getInt32(0);

         //now get next 32 bit from array and convert it to integer 
         //from offset 4 
         var d = dv.getInt32(4);

         //XOR first end second integer numbers 
         return c ^ d;
     }

我认为这对某人有用

编辑:使用一个缓冲区和 DataView 更快!

关于JavaScript 从实数和整数计算哈希码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31157057/

相关文章:

javascript - 等待代码完成 Ionic 生命周期

javascript - 访问传递给原型(prototype)函数的值

javascript - 使用 css 的响应之字形布局?

javascript - 如何在 contenteditable 区域选择被替换的文本

javascript - 如何在 java 应用程序仍在编译时显示加载页面?

Angular 和 eslint - 未找到规则 '@typescript-eslint/space-infix-ops' 的定义

angular - 使用 .forEach 的自定义验证器 - 可以以不同的方式完成(更好)吗?

javascript - 如何检查多个 Jest spy 调用的多个参数?

javascript - 将 Immer 与 NgRx reducer 集成

javascript - 当数据库中的表发生更改时通知用户