如何减少字符串的长度?

时间:2015-10-22 11:14:33

标签: python compression

我正在尝试减小字符串的大小:

'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0NDU0OTk3NDUsImQiOnsiYXV0aF9kYXRhIjoiZm9vIiwib3RoZXJfYXV0aF9kYXRhIjoiYmFyIiwidWlkIjoidW5pcXVlSWQxIn0sInYiOjB9.h6LV3boj0ka2PsyOjZJb8Q48ugiHlEkNksusRGtcUBk'

某人可以在不到30秒的时间内打字:

'aF9kYX'

并且能够将其转回原始字符串。我怎么能做到这一点?

编辑:我想我不清楚,首先我不知道我想要的是否可能。 所以,我有我的应用程序要求登记令牌,这就是JWT。但是有人手动打字太长了。所以我认为有一种算法可以使这个字符串变小(压缩它),这样就可以更轻松,更快速地输入。我想到如何使用这种算法的一个例子是:

short_to_big(small_string) //Returns the original JWT
big_to_short(JWT_string)   //Returns the smaller string 

4 个答案:

答案 0 :(得分:0)

愚蠢的简单回答:使用dict将短字符串存储为键,将长字符串存储为值。然后你只需要按自己喜欢的方式生成短字符串,并确保它不在dict中。如果你需要持久化键/值,你可以使用几乎任何类型的数据库(sql,key:value,document,甚至是csv文件FWIW)。

哦,如果这不能解决您的问题,那么您可能需要考虑提供更多背景;)

答案 1 :(得分:0)

您需要更多限制。 200字符的字符串包含比6字符字符串更多的信息,因此要么需要更多关于原始字符串(例如,它们来自一些已知的字符串集,或者具有有限的字符集),或者您需要存储原始字符串在某处,并使用用户键入的字符串作为地图或类似的键。

有无损压缩算法,但这些算法依赖于知道关于字符串的一些概率信息(例如,可能存在重复字符),并且如果概率错误,通常会扩展字符串。

答案 2 :(得分:-1)

更新(在提出问题澄清和评论意见后)

您可以实现一种算法,唯一将此大字符串映射到字符串的简短表示形式,并将此映射存储在字典中。以下算法不保证唯一性,但应该为您提供一些可以遵循的路径。

import random
import string

def long_string_to_short(original_string, length=10):
    random.seed(original_string)
    filling_values = string.digits + string.ascii_letters
    short_string = ''.join(random.choice(filling_values) for char_ in xrange(length))
    return short_string

调用该函数时,您可以为短字符串指定适当的长度。

然后你可以:

my_mapping_dict = {}
my_long_string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0NDU0OTk3NDUsImQiOnsiYXV0aF9kYXRhIjoiZm9vIiwib3RoZXJfYXV0aF9kYXRhIjoiYmFyIiwidWlkIjoidW5pcXVlSWQxIn0sInYiOjB9.h6LV3boj0ka2PsyOjZJb8Q48ugiHlEkNksusRGtcUBk'
short_string = long_string_to_short(my_long_string)
my_mapping_dict[short_string] = my_long_string

答案 3 :(得分:-1)

好的,所以,因为我找不到缩小字符串的解决方案,我试着给它一个不同的方法,并找到了解决方案。

现在澄清为什么我想用令牌登录,我将写下我想用我的应用程序做的事情:

在Firebase中,任何人都可以创建一个帐户,但我不希望如此,因此我创建了一组用户,这些用户是唯一可以写入或读取数据的用户。

因此,为了创建帐户,用户必须请求注册码(实际上这是从Firebase生成的JWT,因此您有权将用户添加到我正在讨论的那个组中)。

此应用程序供本地使用,这意味着只有居住在这里的人才会使用它。所以,回到最初的问题,令牌对于某人来说太大了(正如我多次说过的那样),我想知道我是否可以缩小它以及如何缩小它。但是没有成功,我尝试了一种不同的方法,即生成令牌(来自不同的程序),使用随机代码对其进行加密,并将其上传到firebase,这样我就可以将随机代码提供给人们,以便用户可以输入它在应用程序中,以便它可以检索和解密令牌并使用它进行身份验证,以便最终用户拥有一个有权读取或写入数据的帐户。

感谢您的回复,对不起,如果我浪费你的时间。