一个适用于限制范围输出的好哈希函数是什么?

3

我需要一个哈希函数将1000个八位十六进制数字映射到一个50*50的矩阵中。我使用的是:

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

但它的功能很糟糕,而且容易冲突。事实上,我想要在网络数据包窗口中计算源IP地址的数量。请帮助我!

你不能使用通用哈希函数将40亿(0xFFFFFFFF)个潜在数字映射到2500个数字而不发生冲突。 - xanatos
仅对1000个数字进行哈希,并查找任何数字的出现频率。 - mohammad madani
1个回答

1

这个类保证没有碰撞 :-) 请注意返回的哈希值是连续的。第一个不同数字的哈希值将为0,第二个不同数字的哈希值将为1,依此类推。

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;
    }
}

像这样使用:
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

@user1125774 你无法拥有一种手写算法。你不能选择2500个哈希值来对应1000个将要出现的值,因为你不知道这些值会是什么。 - xanatos
我是一名学生,正在进行课程项目。 - mohammad madani
相当正确,但我需要达到适当的水平。并非毫无缺点。 - mohammad madani
@user1125774,按照你现在所做的方式,将整个空间简单地分成两半(使用%50)是最好的方法。 - xanatos
@user1125774,除非你有一些统计数据表明数字的分布不是均匀的,也许小于1000000的数字比大于1000000的数字要多。那么你才能优化算法。 - xanatos
谢谢您的回复。 - mohammad madani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接