Ciao, ho bisogno di una funzione per calcolare un numero intero univoco dal numero (numero reale doppia precisione) e numero intero.JavaScript calcola hashcode dal numero reale e dal numero intero
Prova a spiegare Sto sviluppando un'applicazione GIS in javascript e sto lavorando con oggetti vettoriali complessi come poligono (array di punti oggetto con due coordinate nell'anello) e linee di punti. Ho bisogno di un algoritmo veloce per riconoscere che l'elemento è stato cambiato deve essere molto veloce perché il mio oggetto vettoriale è una raccolta di migliaia di punti. In C# sto calcolando il codice hash dalla coordinata utilizzando l'operazione bit a bit XOR.
Ma javascript converte tutti gli operandi in operazioni bit a bit in numero intero ma ho bisogno di convertire la precisione doppia in numero intero prima di applicarlo a bit in modo C# (binnary). Nel reflector vedo questo che C# calcola il codice hash da double come questo e ho bisogno di questa funzione in javascript il più velocemente possibile.
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)));
}
Esempio:
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
Esempio risultato non è corretto hash == hash1
Esempio 2: utilizzo di stringa non è corretto risultato, ma calcolare Hash da stringa è quello di complicare e io cosa non è abbastanza veloce
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
risultato Example2 è corretto hash! = Hash1
C'è qualche modo più veloce di convertire il numero a stringa di calcolo hash da ogni personaggio? Perché il mio oggetto è molto grande e ci vorrà molto tempo e operazioni in questo modo ...
Io provo a farlo usando TypedArrays ma ancora non ho successo.
Grazie mille per il vostro aiuto
Ciao, grazie mille l'ho risolto io stesso pochi minuti prima del tuo post ... ma grazie mille ... –
Non posso commentare la tua risposta, mi dispiace. La tua soluzione utilizza più chiamate rispetto a quella a cui mi sono collegato, quindi mi aspetto che questa sarà più veloce. Si prega di verificare e quindi accettare la risposta più veloce. – Neofish
vedo che non usano dataview ... ci proverò! Grazie –