数组位置/字符串的(此特定)XOR散列算法的名称

时间:2012-11-30 02:09:59

标签: algorithm hash xor lzw

我从这里得到以下C代码:

http://marknelson.us/1989/10/01/lzw-data-compression/

它声明它使用XOR散列算法来避免必须搜索子串数组元素,而是为子字符串生成“地址”。

然后有一个散列函数,下面的行似乎是我的主要部分:

index = (hash_character << HASHING_SHIFT) ^ hash_prefix;
  • 这里我们有一个整数值,从4位向左移位(根据常量的定义)。

  • 然后,此值将使用另一个整数值进行XOR。

我很确定移位部分只是为了摆脱未使用的位,然后将一个简单的XOR操作应用于一个非常短的子串,从12位到16位;虽然我可能在这方面做错了。

解释此特定XOR散列算法的名称或可能的算法名称列表是什么,或者如果可能,还有一个适合此子字符串应用程序的算法名称列表(如LZW子串字典中)等等)?





#define BITS 12                   /* Setting the number of bits to 12, 13*/
#define HASHING_SHIFT (BITS-8)    /* or 14 affects several constants.    */
#define MAX_VALUE (1 << BITS) - 1 /* Note that MS-DOS machines need to   */
#define MAX_CODE MAX_VALUE - 1    /* compile their code in large model if*/
                                  /* 14 bits are selected.               */
#if BITS == 14
  #define TABLE_SIZE 18041        /* The string table size needs to be a */
#endif                            /* prime number that is somewhat larger*/
#if BITS == 13                    /* than 2**BITS.                       */
  #define TABLE_SIZE 9029
#endif
#if BITS <= 12
  #define TABLE_SIZE 5021
#endif

...

...

...

/*
** This is the hashing routine.  It tries to find a match for the prefix+char
** string in the string table.  If it finds it, the index is returned.  If
** the string is not found, the first available index in the string table is
** returned instead.
*/

int find_match(int hash_prefix,unsigned int hash_character)
{
int index;
int offset;

  index = (hash_character << HASHING_SHIFT) ^ hash_prefix;
  if (index == 0)
    offset = 1;
  else
    offset = TABLE_SIZE - index;
  while (1)
  {
    if (code_value[index] == -1)
      return(index);
    if (prefix_code[index] == hash_prefix &&
        append_character[index] == hash_character)
      return(index);
    index -= offset;
    if (index < 0)
      index += TABLE_SIZE;
  }
}




1 个答案:

答案 0 :(得分:2)

Bruno Preiss&#39;中描述了类似的哈希函数。 &#34; Java中面向对象设计模式的数据结构和算法&#34; John Wiley&amp;儿子,2000年

一个很好但有点过时的哈希函数调查是here。该函数名为&#34; BPhash&#34;在调查中。 LZW哈希函数对我来说看起来很简单。现在已知的哈希函数可能更好,产生的冲突更少,从而提高了哈希效率/效率。