【问题标题】:Random hash in PythonPython中的随机哈希
【发布时间】:2023-03-18 10:20:02
【问题描述】:

在 Python 中生成随机哈希 (MD5) 的最简单方法是什么?

【问题讨论】:

  • 随机什么的?还是为了一个对象?如果您只想要一个随机的 MD5,只需选择一些数字即可。
  • 我正在重命名文件,然后再上传并想要这样的文件名:timestamp_randomd5.extension 干杯!
  • 您可以将它们重命名为 timestamp_randomnumber.ext。 md5(randomnumber) 确实没有理由比 randomnumber 本身更好。
  • Python 3 的最佳答案是最后一个 import uuid; uuid.uuid().hex stackoverflow.com/a/20060712/3218806

标签: python hash md5


【解决方案1】:

md5-hash 只是一个 128 位的值,所以如果你想要一个随机的值:

import random

hash = random.getrandbits(128)

print("hash value: %032x" % hash)

不过,我真的不明白这一点。也许你应该详细说明你为什么需要这个......

【讨论】:

  • +1 用于不从随机数计算相对昂贵的哈希:这种方法快 5 倍。
  • +1 - 这肯定比我的回答要好,也可以这样使用: hex(random.getrandbits(128))[2:-1] 这为您提供与 md5 hexdigest 方法相同的输出.
  • random.seed() 调用或多或少没用。
  • 我会使用 os.urandom 因为想要一个 MD5 哈希可能意味着想要一个安全的。
  • 这里是使用os.urandom的方法:''.join('%02x' % ord(x) for x in os.urandom(16))
【解决方案2】:

我认为你要找的是一个通用的唯一标识符。那么python中的模块UUID就是你要找的。​​p>

import uuid
uuid.uuid4().hex

UUID4 为您提供一个随机唯一标识符,其长度与 md5 总和相同。 Hex 将 is 表示为一个十六进制字符串,而不是返回一个 uuid 对象。

http://docs.python.org/2/library/uuid.html

【讨论】:

    【解决方案3】:

    secrets module 是在 Python 3.6+ 中添加的。它通过一次调用提供加密安全的随机值。这些函数采用可选的 nbytes 参数,默认为 32(字节 * 8 位 = 256 位令牌)。 MD5 有 128 位哈希,因此为“类似 MD5”的令牌提供 16 个。

    >>> import secrets
    
    >>> secrets.token_hex(nbytes=16)
    '17adbcf543e851aa9216acc9d7206b96'
    
    >>> secrets.token_urlsafe(16)
    'X7NYIolv893DXLunTzeTIQ'
    
    >>> secrets.token_bytes(128 // 8)
    b'\x0b\xdcA\xc0.\x0e\x87\x9b`\x93\\Ev\x1a|u'
    

    【讨论】:

      【解决方案4】:

      这适用于 python 2.x 和 3.x

      import os
      import binascii
      print(binascii.hexlify(os.urandom(16)))
      '4a4d443679ed46f7514ad6dbe3733c3d'
      

      【讨论】:

      • 这种十六进制编码方式不再适用于 Python 3。
      • 谢谢。这是制作随机散列密钥的最佳方式。
      • 适用于 2.x 和 3.x:binascii.hexlify(os.urandom(16))
      【解决方案5】:

      另一种方法。您无需格式化 int 即可获得它。

      import random
      import string
      
      def random_string(length):
          pool = string.letters + string.digits
          return ''.join(random.choice(pool) for i in xrange(length))
      

      让您在字符串长度上具有灵活性。

      >>> random_string(64)
      'XTgDkdxHK7seEbNDDUim9gUBFiheRLRgg7HyP18j6BZU5Sa7AXiCHP1NEIxuL2s0'
      

      【讨论】:

      • 我可能会将 string.letters 更改为 'abcdf' 以反映十六进制数字。但是很好的解决方案!
      • ''.join(random.sample(string.ascii_letters + string.digits, 8)) 更多pythonic?
      • string.ascii_letters 用于 python 3 而不是 string.letters
      【解决方案6】:

      解决这个特定问题的另一种方法:

      import random, string
      
      def random_md5like_hash():
          available_chars= string.hexdigits[:16]
          return ''.join(
              random.choice(available_chars)
              for dummy in xrange(32))
      

      我并不是说它比任何其他答案更快或更可取;只是它是 另一种 方法:)

      【讨论】:

        【解决方案7】:
        import uuid
        from md5 import md5
        
        print md5(str(uuid.uuid4())).hexdigest()
        

        【讨论】:

          【解决方案8】:
          import os, hashlib
          hashlib.md5(os.urandom(32)).hexdigest()
          

          【讨论】:

            【解决方案9】:
            
            from hashlib import md5
            plaintext = input('Enter the plaintext data to be hashed: ') # Must be a string, doesn't need to have utf-8 encoding
            ciphertext = md5(plaintext.encode('utf-8')).hexdigest()
            print(ciphertext)
            

            还需要注意的是,MD5是一个非常弱的哈希函数,也发现了冲突(两个不同的明文值导致相同的哈希) 只需为 plaintext 使用随机值。

            【讨论】:

            • 要求用户输入无助于原始问题的“最简单”方面...
            • 你检查你的代码了吗?它在第 3 行缺少一个括号。
            猜你喜欢
            • 2016-09-07
            • 2015-08-15
            • 2011-10-04
            • 1970-01-01
            • 2011-05-02
            • 2010-10-06
            • 2011-08-17
            • 2017-03-17
            • 1970-01-01
            相关资源
            最近更新 更多