2

对于相干噪声的实现(类似于Perlin noise),我正在寻找适合图形的散列函数。

我不需要它以任何方式加密,实际上,我什至不需要它是一个超级出色的哈希。

我只想组合两个 16 位数字并输出一个 8 位哈希。尽可能随机是好的,但在 AVR 处理器(8 位,Arduino 使用的)上快速也是好的。

目前我在这里使用一个实现:

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 位之外的所有位,而且我不需要任何壮观的东西,我可以使用更少的指令来完成一些事情吗?

…我在这个搜索中受到了与 FastLED 打包的lib8tion库的启发。它具有特定的功能,例如,将两个数字相乘以在尽可能少的时钟周期内uint8_t给出一个数字。uint16_t

4

1 回答 1

2

查看Pearson 哈希

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)];
}
于 2018-04-04T08:32:24.990 回答