【问题标题】:using a key to rearrange string使用键重新排列字符串
【发布时间】:2010-02-27 00:03:19
【问题描述】:

使用 Python 我想随机根据给定的键重新排列字符串的各个部分。我也想用同一个key恢复原字符串:

def rearrange(key, data):
    pass

def restore(key, rearranged_data):
    pass

效率并不重要。有什么想法吗?

编辑:

【问题讨论】:

  • “章节”? “钥匙”?你必须做得比这更好......
  • 我希望您不要将它用于某种形式的加密/混淆 - 因为它非常弱。

标签: python algorithm string encryption


【解决方案1】:

使用random.shuffle 和密钥作为种子:

import random

def rearrange(key, data):
    random.seed(key)
    d = list(data)
    random.shuffle(d)
    return ''.join(d)

def restore(key, rearranged_data):
    l = len(rearranged_data)
    random.seed(key)
    d = range(l)
    random.shuffle(d)
    s = [None] * l
    for i in range(l):
        s[d[i]] = rearranged_data[i]
    return ''.join(s)


x = rearrange(42, 'Hello, world!')
print x
print restore(42, x)

输出:

oelwrd!, llHo
Hello, world!

【讨论】:

  • 我的更快,但你的确实有效——所以我删除了我的。
【解决方案2】:

您可以重新发明轮子,但如果可能的话,为什么不先尝试encryption library

【讨论】:

  • 那将是理想的,因为我已经在使用 pycrypto。我在那里没有找到这样的算法,但是文档非常有限 - 存在吗?
  • 库中的算法都经过“测试”并被广泛使用。您自己的算法将不存在。选择 AES 一个,你会没事的
【解决方案3】:

sort() 反转洗牌的实现:

import random

def reorder_list(ls, key):
   random.seed(key)
   random.shuffle(ls)

def reorder(s, key):
   data = list(s)
   reorder_list(data, key)
   return ''.join(data)

def restore(s, key):
   indexes = range(len(s))
   reorder_list(indexes, key)
   restored = sorted(zip(indexes, list(s)))
   return ''.join(c for _, c in restored)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 2013-07-31
    • 2015-08-08
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    相关资源
    最近更新 更多