代码之家  ›  专栏  ›  技术社区  ›  Peter Jaric

一种函数,输入的微小变化总是导致输出的巨大变化

  •  5
  • Peter Jaric  · 技术社区  · 15 年前

    此函数的一个重要特性是,如果将坐标对用作输入,并将结果打印(例如,作为灰度值)到图像上,则只有当图像非常大时,才能看到任何重复图案。

    import hashlib
    def uniqnum(x, y):
        return int(hashlib.md5(str(x) + ',' + str(y)).hexdigest()[-6:], 16)
    

    6 回复  |  直到 15 年前
        1
  •  8
  •   JUST MY correct OPINION    15 年前

    你所描述的问题。看到了吗 wikipedia's article

    任何你使用的哈希函数都很好;散列函数往往根据以下标准进行判断:

    • 他们阻止的程度 碰撞 (两个独立的输入产生相同的输出)--其副产品是函数将任何输入可能永远无法达到的输出最小化的程度。
    • 给定一组均匀分布的输入,其输出分布的均匀性

    (见 perfect hash function )

    从表面上看,把整数变成字符串几乎像是另一层加密(我想这对你来说是好事)

    但是,您的问题需要处理 特别是数字 ,我们开始吧。


    处理整数的哈希函数

    如果你想借用已有的算法,你可能想涉猎一下 pseudo-random number generators

    一个简单的方法是中间平方法:

    • 摆平它

    伊恩,

    1111 => 01234321 => 2342
    

    因此,1111将被“散列”为2342,在中间平方法中。

    有效,但对于少数散列,这具有非常低的碰撞率、均匀分布和巨大的混沌潜力(小的变化=>巨大的变化)。但如果你有很多价值观,是时候去寻找别的东西了。。。

    http://en.wikipedia.org/wiki/Mersenne_twister] . 事实上,每一种编程语言都可能有一个实现。你的散列“输入”在他们的术语中被称为“种子”。

    总之

    1. 基于字符串的哈希函数没有问题
    2. 如果你想坚持使用整数并且很花哨,可以尝试使用你的数字作为伪随机数生成器的种子。
        2
  •  4
  •   Henk Holterman    15 年前

    哈希非常符合您的要求。如果你真的不想使用字符串,找一个可以接受数字或二进制数据的哈希库。但是在我看来使用字符串是可以的。

        3
  •  3
  •   Pete Kirkham    15 年前

    Bob Jenkins' mix function 是一个经典的选择,当n=3时。

        4
  •  1
  •   Nick Johnson    15 年前

    正如其他人所指出的,散列函数正是您想要的。散列接受字节(而不是字符串)并返回字节,当然,整数和字节之间的转换很简单。下面是一个python函数示例,该函数处理32位整数,并输出一个32位整数:

    import hashlib
    import struct
    
    def intsha1(ints):
      input = struct.pack('>%di' % len(ints), *ints)
      output = hashlib.sha1(input).digest()
      return struct.unpack('>i', output[:4])
    

    当然,它可以很容易地适应不同长度的输入和输出。

        5
  •  0
  •   Qubeuc    15 年前

    看看这个,也许你能有所启发

    Chaotic system

        6
  •  0
  •   Ashish Chaurasia    15 年前

    一个x位的分组密码将把一个数字有效地转换成另一个数字。您可以组合(sum/mult?)输入的数字并对它们进行加密,或者对每个数字进行迭代加密—类似于CBC或链式模式。谷歌'格式保留百科全书'。可以创建一个32位的分组密码(不能广泛使用)并使用它来创建一个“散列”输出。散列和加密的主要区别在于散列是不可逆的。

    推荐文章