我从这里得到以下 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;
}
}