【问题标题】:c questions about hashtablec 关于哈希表的问题
【发布时间】:2014-05-30 11:04:33
【问题描述】:

以下是一些预处理哈希表的代码:

unsigned long cryptTable[0x500];
void StringHash::InitCryptTable() 
{  
    unsigned long seed = 0x00100001, index1 = 0, index2 = 0, i; 

    for( index1 = 0; index1 < 0x100; index1++ ) 
    {  
        for( index2 = index1, i = 0; i < 5; i++, index2 += 0x100 ) 
        {  
            unsigned long temp1, temp2; 
            seed = (seed * 125 + 3) % 0x2AAAAB; 
            temp1 = (seed & 0xFFFF) << 0x10; 
            seed = (seed * 125 + 3) % 0x2AAAAB; 
            temp2 = (seed & 0xFFFF); 
            cryptTable[index2] = ( temp1 | temp2 );  
        }  
    }  
} 

有没有人能告诉我为什么seed = 0x00100001和下面的算法,为什么不直接做memset(cryptTable, 0, sizeof(cryptTable)),这样做有什么好处呢?

【问题讨论】:

    标签: c++ hashtable


    【解决方案1】:

    这部分代码有多个方面。首先,您应该大致了解密码学和随机生成器。

    • 0x00100001 - 和其他的一样好
    • 0x2AAAAB=2796203 是素数,迭代种子 = (seed * 125 + 3) % 0x2AAAAB 将为您提供 0...2796202 的伪随机数字序列
    • seed & 0xFFFF 会给你 16 位的伪随机数

    根据第二部分 - 它取决于使用它的位置......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-20
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 2020-09-03
      • 1970-01-01
      相关资源
      最近更新 更多