gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:00:14 26 4
gpt4 key购买 nike

您好,我需要一个函数来根据数字(实数 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com