如何减少字符串的长度?
How to reduce the length of a string?
我正在尝试像这样减小字符串的大小:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0NDU0OTk3NDUsImQiOnsiYXV0aF9kYXRhIjoiZm9vIiwib3RoZXJfYXV0aF9kYXRhIjoiYmFyIiwidWlkIjoidW5pcXVlSWQxIn0sInYiOjB9.h6LV3boj0ka2PsyOjZJb8Q48ugiHlEkNksusRGtcUBk'
某人可以在不到 30 秒内输入的内容,如下所示:
'aF9kYX'
也能把它变回原来的字符串。我怎样才能做到这一点?
编辑:我想我不清楚,首先我不知道我想要的是否可行。
所以,我有我的应用程序,它要求一个令牌来登录,这就是 JWT。但是对于有人手动输入来说太长了。所以我假设有一种算法可以使这个字符串更小(压缩),这样它就可以更容易、更快地输入。关于如何使用这种算法,我想到的一个例子是:
short_to_big(small_string) //Returns the original JWT
big_to_short(JWT_string) //Returns the smaller string
愚蠢的简单答案:使用字典将短字符串存储为键,将长字符串存储为值。然后你只需要按照你喜欢的方式生成短字符串并确保它不在字典中。如果您需要保留 key/value,您几乎可以使用任何类型的数据库(sql、key:value、文档,甚至是 csv 文件 FWIW)。
哦,如果这不能解决您的问题,那么您可能需要考虑提供更多背景信息;)
UPDATE(经过问题澄清和评论建议)
您可以实施一种算法,唯一地 将这个大字符串映射到该字符串的短表示形式,并将该映射存储在字典中。以下算法不保证 唯一性 但应该为您提供一些可遵循的路径。
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
您需要更多约束。一个 200 个字符的字符串比一个 6 个字符的字符串包含更多的信息,因此要么需要更多关于原始字符串的信息(例如,它们来自一些已知的字符串集,或者具有有限的字符集),要么您需要存储某处的原始字符串并使用用户键入的字符串作为映射或类似的键。
有无损压缩算法,但这些算法取决于了解有关字符串的一些概率信息(例如,可能有重复的字符),如果概率错误,通常会扩展字符串。
好的,所以,因为我找不到缩小字符串的解决方案,所以我尝试给它一个不同的方法,并找到了解决方案。
现在为了澄清我为什么要使用令牌登录,我将写下我想用我的应用程序做什么:
在 Firebase 中,任何人都可以创建一个帐户,但我不希望那样,因此我创建了一组用户,他们是唯一可以写入或读取数据的用户。
所以为了创建一个帐户,用户必须请求一个注册码,(这实际上是一个从 Firebase 生成的 JWT,所以你有权将用户添加到我正在谈论的那个组).
这个应用程序是供本地使用的,这意味着只有住在这里的人才能使用它。所以,回到最初的问题,token 太大了,无法输入(我已经说过很多次了),我想知道是否可以缩小它以及如何缩小它。但没有成功,我尝试了一种不同的方法,即生成令牌(从不同的程序),用随机代码加密,然后上传到 firebase,这样我就把随机代码给人们,这样用户就可以输入它在应用程序中,以便它可以检索和解密令牌并使用它进行身份验证,以便最终用户拥有一个有权读取或写入数据的帐户。
感谢您的回复,如果浪费了您的时间,我深表歉意。
我正在尝试像这样减小字符串的大小:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0NDU0OTk3NDUsImQiOnsiYXV0aF9kYXRhIjoiZm9vIiwib3RoZXJfYXV0aF9kYXRhIjoiYmFyIiwidWlkIjoidW5pcXVlSWQxIn0sInYiOjB9.h6LV3boj0ka2PsyOjZJb8Q48ugiHlEkNksusRGtcUBk'
某人可以在不到 30 秒内输入的内容,如下所示:
'aF9kYX'
也能把它变回原来的字符串。我怎样才能做到这一点?
编辑:我想我不清楚,首先我不知道我想要的是否可行。 所以,我有我的应用程序,它要求一个令牌来登录,这就是 JWT。但是对于有人手动输入来说太长了。所以我假设有一种算法可以使这个字符串更小(压缩),这样它就可以更容易、更快地输入。关于如何使用这种算法,我想到的一个例子是:
short_to_big(small_string) //Returns the original JWT
big_to_short(JWT_string) //Returns the smaller string
愚蠢的简单答案:使用字典将短字符串存储为键,将长字符串存储为值。然后你只需要按照你喜欢的方式生成短字符串并确保它不在字典中。如果您需要保留 key/value,您几乎可以使用任何类型的数据库(sql、key:value、文档,甚至是 csv 文件 FWIW)。
哦,如果这不能解决您的问题,那么您可能需要考虑提供更多背景信息;)
UPDATE(经过问题澄清和评论建议)
您可以实施一种算法,唯一地 将这个大字符串映射到该字符串的短表示形式,并将该映射存储在字典中。以下算法不保证 唯一性 但应该为您提供一些可遵循的路径。
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
您需要更多约束。一个 200 个字符的字符串比一个 6 个字符的字符串包含更多的信息,因此要么需要更多关于原始字符串的信息(例如,它们来自一些已知的字符串集,或者具有有限的字符集),要么您需要存储某处的原始字符串并使用用户键入的字符串作为映射或类似的键。
有无损压缩算法,但这些算法取决于了解有关字符串的一些概率信息(例如,可能有重复的字符),如果概率错误,通常会扩展字符串。
好的,所以,因为我找不到缩小字符串的解决方案,所以我尝试给它一个不同的方法,并找到了解决方案。
现在为了澄清我为什么要使用令牌登录,我将写下我想用我的应用程序做什么:
在 Firebase 中,任何人都可以创建一个帐户,但我不希望那样,因此我创建了一组用户,他们是唯一可以写入或读取数据的用户。
所以为了创建一个帐户,用户必须请求一个注册码,(这实际上是一个从 Firebase 生成的 JWT,所以你有权将用户添加到我正在谈论的那个组).
这个应用程序是供本地使用的,这意味着只有住在这里的人才能使用它。所以,回到最初的问题,token 太大了,无法输入(我已经说过很多次了),我想知道是否可以缩小它以及如何缩小它。但没有成功,我尝试了一种不同的方法,即生成令牌(从不同的程序),用随机代码加密,然后上传到 firebase,这样我就把随机代码给人们,这样用户就可以输入它在应用程序中,以便它可以检索和解密令牌并使用它进行身份验证,以便最终用户拥有一个有权读取或写入数据的帐户。
感谢您的回复,如果浪费了您的时间,我深表歉意。