【问题标题】:Linux command equivalent of hash() in pythonLinux命令等效于python中的hash()
【发布时间】:2016-04-20 16:10:44
【问题描述】:

在我的程序里有一个日志目录。日志目录的名称很长,所以在我的 python 脚本中,我使用哈希函数来获取唯一代码并将其附加到固定字符串,即:

LOG_DIR = "abcdefghijklmnopqrstuvwxyz"
 log_dir_hashed = hash(LOG_DIR)
 new_log_dir = "log_%s" %log_dir_hashed

由于我是 python 新手,请告诉我上面的代码是否有任何问题?还有如何在shell脚本中做类似的事情,使哈希后得到的python目录名和shell目录名的结果相同。

【问题讨论】:

    标签: python linux


    【解决方案1】:

    hash() 是 python 的实现细节,__hash__ dunders 甚至可以覆盖它的功能,所以你不应该那样使用它。它也有一些可能的surprising properties,比如:

    # This is not a collision produced by the used hashing method, it is
    # how hash() functions. The result though is a collision.
    >>> hash(-2) == hash(-1)
    True
    

    使用众所周知的哈希值,如 MD5 或 SHA1 等。如果您需要加密安全的日志目录,请根据此选择合适的哈希值。看看https://docs.python.org/3/library/hashlib.html。这些都有可用的等效命令行工具。

    例如:

    from hashlib import md5
    
    log_dir_hashed = md5('abcdefghijklmnopqrstuvwxyz'.encode('utf-8')).hexdigest()
    new_log_dir = "log_%s" % log_dir_hashed
    

    比较python:

    >>> md5('abcdefghijklmnopqrstuvwxyz'.encode('utf-8')).hexdigest()
    'c3fcd3d76192e4007dfb496cca67e13b'
    

    和等效的命令行(一种方法):

     % echo -n 'abcdefghijklmnopqrstuvwxyz' | md5sum - | awk '{print $1}'
    c3fcd3d76192e4007dfb496cca67e13b
    

    【讨论】:

    • 是的,我忘记了引号,已更正了问题。我这样做只是为了减少文件名的长度......没什么大不了的。
    • “这不是冲突,它是 hash() 的作用方式” - 不,这是冲突。这也可能是hash() 的作用方式,但这并不意味着它不是冲突。
    • @user2357112 在“使用的散列方法为这两个值产生相同的值”的意义上,这不是冲突,而是在“这个函数不能返回 -1 作为有效的返回值” ”。是的,它们会发生冲突,但不是传统意义上的哈希冲突。
    • 感谢您的解决方案!
    • 您在 echo 中缺少 -n。它在“logdir”之后添加一个换行符。将您的命令行命令与md5.new("logdir\n").hexdigest() 进行比较。顺便说一句,你似乎使用的是 python 2,你不必.encode(),因为 python 2 中的字符串是字节字符串开头的。如果您使用 unicode 字符串(python 2 中的u"logdir"),情况就不同了。
    【解决方案2】:

    哈希正在对您的目录进行加密,基本上将您的数据转换为 MD5/SHA 或其他加密。

    您可以在 shell 脚本中使用 crypt(Data) 来获得相同的结果。

    例如。

    log_dir_hashed=crypt(LOG_DIR)

    【讨论】:

    • 我试过这样:logdir="abcdefghijklmnopqrstuvwxyz" new_logs=crypt($logdir) 但不起作用
    猜你喜欢
    • 2012-08-29
    • 2010-09-08
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    相关资源
    最近更新 更多