热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

散列函数产生噪声

我正在制作价值噪声发生器,发现我当前的哈希值在图像中产生了一种图案:

我正在制作价值噪声发生器,发现我当前的哈希值在图像中产生了一种图案:

散列函数产生噪声

所以我正在寻找一种更好的,不可预测/不可重复的哈希函数。

我使用哈希而不是随机数,因为我希望它具有确定性。给定(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;
}

推荐阅读
author-avatar
安安1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有