连续输入序列的普通哈希值,在输出中没有可见的周期

时间:2012-07-18 12:35:15

标签: python hash

在一个简单的基于图块的图像中,如果草的每个区域在每个正方形上重复相同的草砖,它看起来像一个可怕的云纹图案,但如果交替使用三个或四个草砖,它看起来非常自然。 / p>

产生这种情况的最佳方法是通过其坐标的简单散列选择每个图块。 (另一种可能的实现方式是在游戏开始时随机选择它们,但如果可能的话我更喜欢散列函数。)

哈希函数的必要属性是:

  • 尽可能快(理想情况下像x + y mod N),不需要加密属性
  • 输出上没有可见的时段:例如。 x + y mod N失败,因为它总是在每行重复相同的N个瓦片

是否有一个简单的算术散列可以工作,并且比“seed(coords);返回randomrange(N)”更简单,但如果输入是“(0,0)”,“(1,0)” ,“(2,0)”......输出中没有可见的图案?

在游戏开始时使用生成一些随机数据会更好吗?

1 个答案:

答案 0 :(得分:1)

我会尝试像

这样的东西
hash(coords) % number_of_tiles

Python的内置hash()函数并不是伪随机函数,但为此目的,它可能已经足够好了。

以下是7个瓷砖的示例:

>>> for x in range(10):
...     for y in range(10):
...         print ".oO^v<>"[hash((x, y)) % 7],
...     print
... 
O < o v . ^ > O > O
. v o < < O > ^ v o
< o > O . ^ o v O <
^ . O > o < . v > ^
o v . ^ ^ > O < v .
> ^ . v o < O > O >
. ^ o v < o > O v .
< O v o . v > ^ O >
v . ^ > O < o v . ^
O > ^ . . v o < < O