作者:安安1 | 来源:互联网 | 2023-06-21 13:10
我正在制作价值噪声发生器,发现我当前的哈希值在图像中产生了一种图案:
所以我正在寻找一种更好的,不可预测/不可重复的哈希函数。
我使用哈希而不是随机数,因为我希望它具有确定性。给定(x,y)坐标,它应该总是产生相同的结果。
这也很好,但是如果可以扩展哈希函数以轻松接受更多参数,例如(x,y,z)或(x,y,z,t),而不是仅仅两个,则不是强制性的
我当前的哈希值是:
public static class Hash
{
public static float GetHash(int x)
{
x = x ^ 61 ^ (x >> 16);
x += x <<3;
x ^= x >> 4;
x *= 0x27d4eb2d;
x ^= x >> 15;
return x / (float)int.MaxValue;
}
public static float GetHash(int x,int y) => GetHash((y <<8) + x);
}
我添加了x / (float)int.MaxValue
行,因为我希望浮点数从0到1。
但是我必须承认我只是从某个地方复制粘贴。按位操作(和散列)不是我的优势。
原始答案:
我会使用https://github.com/Auburns/FastNoise_CSharp之类的库
也许您可以从FastNoise.cs文件中的源代码中学习
修改后的答案,包括代码和来自引用源“ Copyright(c)2017 Jordan Peck”的哈希函数
private const int X_PRIME = 1619;
private const int Y_PRIME = 31337;
private const int Z_PRIME = 6971;
private const int W_PRIME = 1013;
private static int Hash2D(int seed,int x,int y)
{
int hash = seed;
hash ^= X_PRIME * x;
hash ^= Y_PRIME * y;
hash = hash * hash * hash * 60493;
hash = (hash >> 13) ^ hash;
return hash;
}
private static int Hash3D(int seed,int y,int z)
{
int hash = seed;
hash ^= X_PRIME * x;
hash ^= Y_PRIME * y;
hash ^= Z_PRIME * z;
hash = hash * hash * hash * 60493;
hash = (hash >> 13) ^ hash;
return hash;
}
private static int Hash4D(int seed,int z,int w)
{
int hash = seed;
hash ^= X_PRIME * x;
hash ^= Y_PRIME * y;
hash ^= Z_PRIME * z;
hash ^= W_PRIME * w;
hash = hash * hash * hash * 60493;
hash = (hash >> 13) ^ hash;
return hash;
}