gpt4 book ai didi

c++ - 从 2 个以上的整数创建哈希/种子值(快速)

转载 作者:行者123 更新时间:2023-11-30 03:53:39 25 4
gpt4 key购买 nike

我正在研究生成不同类型的渐变噪声。这种噪声需要的一件事是在给定位置 vector 的情况下生成随机 vector 。

此位置 vector 可以是单个 int 或 2D 位置、3D 位置、4D 位置等中的任何值

除此之外,还需要一个额外的“种子”值。

所需要的是将这 n+1 个整数散列为一个唯一的整数,我可以用它来为 PRNG 做种。重要的是这些值,因为每次使用相同的值时我都需要能够检索原始种子。

到目前为止,我已经尝试了 Fowler–Noll–Vo 的实现;但对我来说太慢了。

我也尝试过连续调用配对函数:

int pairing_function(int x, int y)
{
return(0.5*(x+y)*(x+y+1) + x);
}

即:

int hash = pairing_function(pairing_function(x,y),seed);

但似乎发生的情况是,如果种子足够大,值会溢出 int(或更大的类型)的大小。

实现我在这里尝试做的事情的好方法是什么?重要的是解决任何加密问题的速度以及不返回大于我的原始数据类型的数字。

我正在使用 C++,但只要任何代码都可读,我就可以将其删除。

最佳答案

奇怪的是,FNV 太慢了,因为每个数据字节只有 1 个异或和 1 个整数乘积。来自 Wikipedia [它] 旨在快速计算

如果你想要真正快速的东西,你可以尝试这些实现,其中乘法被编码为移位和加法:

丹·伯恩斯坦实现:

unsigned long
hash(unsigned char *str)
{
unsigned long hash = 5381;
int c;

while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

return hash;
}

sdbm 实现 (hash(i) = hash(i - 1) * 65599 + str[i]) :

static unsigned long
sdbm(str)
unsigned char *str;
{
unsigned long hash = 0;
int c;

while (c = *str++)
hash = c + (hash << 6) + (hash << 16) - hash;

return hash;
}

引用文献 "Hash Functions" from cse.yorku.ca

关于c++ - 从 2 个以上的整数创建哈希/种子值(快速),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30032950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com