相关疑难解决方法(0)

对于整数的集合(即多集),什么是好的散列函数?

我正在寻找一个将多组整数映射到整数的函数,希望它具有成对独立性等某种保证.

理想情况下,内存使用量将保持不变,并且哈希值可以在插入/删除后的O(1)时间内更新.(这禁止执行诸如排序整数和使用哈希函数之类的操作,如h(x)= h_1(x_1,h_2(x_2,h_3(x_3,x_4))).)

XORing哈希值不起作用,因为h({1,1,2})= h({2})

我认为如果底层哈希函数具有不切实际的强保证(例如n独立性),则将模数乘以模数可能会起作用.

algorithm hash

20
推荐指数
1
解决办法
1万
查看次数

用于整数列表的良好散列函数,其中顺序不会改变值

给定一组整数,一个“功能组”,是否有更好的方法来获取整数的 GetHashCode,其中数字的位置不影响哈希?

void Main()
{
    int[] ints = { 10001, 10002, 10003, 10004, 10005 };

    int hash = GetHashCode(ints);

    Console.WriteLine("hash={0}", hash);
}

int GetHashCode(IEnumerable<int> integers)
{
    IEnumerator<int> intEnum = integers.GetEnumerator();

    if(intEnum.MoveNext()==false) return 0;

    int hash = 0;
    unchecked {
        hash = intEnum.Current.GetHashCode();
        for(;intEnum.MoveNext()==true;)
            hash = 31 * hash + intEnum.Current.GetHashCode();
    }

    return hash;
}
Run Code Online (Sandbox Code Playgroud)

这个输出是:hash=954101523 如果我交换 10003 和 10002 我得到:hash=954130353

除了在获取散列之前对列表进行排序之外,如果列表位置中的项目发生变化,是否有更好的选择不会改变?

整数列表基本上代表一组作为“功能组”的记录 ID,因此“功能组”实际上是关键,而不是真正依赖于顺序

c#

6
推荐指数
1
解决办法
1581
查看次数

标签 统计

algorithm ×1

c# ×1

hash ×1