8 位处理器上 8 / 16 位 "graphics" 的哈希函数
Hash function for 8 / 16 bit "graphics" on 8 bit processor
用于相干噪声的实现(类似于Perlin noise), I'm looking for a hash function适用于图形。
我不需要它以任何方式进行加密,实际上,我什至不需要它成为超级出色的哈希。
我只想合并两个 16 位数字并输出一个 8 位散列。尽可能随机是好的,而且,在 AVR 处理器(8 位,Arduino 使用的)上快速也是好的。
目前我正在使用一个实现 here:
const uint32_t hash(uint32_t a)
{
a -= (a<<6);
a ^= (a>>17);
a -= (a<<9);
a ^= (a<<4);
a -= (a<<3);
a ^= (a<<10);
a ^= (a>>15);
return a;
}
但是考虑到我正在截断除 8 位之外的所有内容,而且我不需要任何特别的东西,我可以使用更少的指令来解决问题吗?
… lib8tion library that's packaged with FastLED 启发了我进行这次搜索。它具有特定的功能,例如,在尽可能少的时钟周期内将两个 uint8_t
数相乘得到一个 uint16_t
数。
查看 Pearson hashing:
unsigned char hash(unsigned short a, unsigned short b) {
static const unsigned char t[256] = {...};
return t[t[t[t[a & 0xFF] ^ (b & 0xFF)] ^ (a >> 8)] ^ (b >> 8)];
}
用于相干噪声的实现(类似于Perlin noise), I'm looking for a hash function适用于图形。
我不需要它以任何方式进行加密,实际上,我什至不需要它成为超级出色的哈希。
我只想合并两个 16 位数字并输出一个 8 位散列。尽可能随机是好的,而且,在 AVR 处理器(8 位,Arduino 使用的)上快速也是好的。
目前我正在使用一个实现 here:
const uint32_t hash(uint32_t a)
{
a -= (a<<6);
a ^= (a>>17);
a -= (a<<9);
a ^= (a<<4);
a -= (a<<3);
a ^= (a<<10);
a ^= (a>>15);
return a;
}
但是考虑到我正在截断除 8 位之外的所有内容,而且我不需要任何特别的东西,我可以使用更少的指令来解决问题吗?
… lib8tion library that's packaged with FastLED 启发了我进行这次搜索。它具有特定的功能,例如,在尽可能少的时钟周期内将两个 uint8_t
数相乘得到一个 uint16_t
数。
查看 Pearson hashing:
unsigned char hash(unsigned short a, unsigned short b) {
static const unsigned char t[256] = {...};
return t[t[t[t[a & 0xFF] ^ (b & 0xFF)] ^ (a >> 8)] ^ (b >> 8)];
}