/ / Che cos'è una buona funzione hash per l'output dell'intervallo limite: c #, hash

Che cos'è una buona funzione hash per l'output dell'intervallo limite - c #, hash

Ho bisogno di una funzione hash per mappare 1000 numeri su una matrice 50 * 50. I miei numeri sono esadecimali di 8 cifre. Uso:

static int[,] matrix = new int[50, 50];
int m=hex[0 to 3]%50;
int n=hex[4 to 7]%50;
matrix[m,n]++;

ma ha una pessima funzione e ha molto Collision.In effetti conterò il numero di IP di origine in una finestra del pacchetto di rete. mi aiuti per favore!

risposte:

1 per risposta № 1

Questa classe garantisce che non ci sonocollisioni :-) Nota che gli hash restituiti sono sequenziali. L'hash del primo numero distinto dato sarà 0, l'hash del secondo numero distinto dato sarà 1 e così via.

public class Hasher
{
private readonly Dictionary<int, int> Hashes = new Dictionary<int, int>();

public int Hash(int value)
{
int hash;

if (!Hashes.TryGetValue(value, out hash))
{
hash = Hashes.Count;
Hashes[value] = Hashes.Count;
}

return hash;
}
}

Usa in questo modo:

var hasher = new Hasher();
int hash1 = hasher.Hash(11); // 0
int hash2 = hasher.Hash(27); // 1
int hash3 = hasher.Hash(11); // 0
int hash4 = hasher.Hash(47); // 2
int hash5 = hasher.Hash(47); // 2