typescript - 在 javascript 中 *无需* 数据库缩短 URL 的最佳方法
我是一个刚接触 Typescript/JavaScript 的 Java 开发者。我接到的任务是通过某种哈希来缩短应用程序的 URL 行。因此,不是这样:
https://www.someurl.com?urgency=all&impact=widespread&contentType=mine&...我需要类似这样的东西:
https://www.someurl.com?params=somethingShort这个问题通常在 Javascript 中是如何解决的?我没有任何可用的存储,所以这将不得不使用内存中的解决方案。
当我搜索“hash URL 参数”时,我得到的是关于位置中的“#”符号的内容,但我觉得那不是我的使用案例……有人能给我指点一个解决方案吗?
答案#1
典型的 URL 缩短服务使用数据库将短 ID 与真实 URL 配对。
没有数据库,你必须创建一个算法,使相同的数据以更短的形式存在。具体怎么做完全取决于你自己。
第一个想法是对参数进行 gzip 压缩,然后对该二进制数据进行 base64 编码,以便在 URL 中使用。但这可能无济于事。
urgency=all&impact=widespread&contentType=mine
先进行 gzip 压缩,然后进行 base64 编码为
eNorLUpPzUuutE3MyVHLzC1ITC6xLc9MSS0uKEpNTFFLzs8rSc0rCaksSLXNzcxLBQCqJxIm
(参见 https://bugdays.com/gzip-base64)
那里面几乎没有重复,而且使用 base64 编码会增加额外的字节。
所以这不是一个普遍性的问题。这是一个特定的问题,很可能会以针对你的应用程序的特定方式得到解决。
更好的选择是自己创建压缩编码。
例如,你可以定义一种压缩格式,为你想按照特定顺序传递的每个值使用一个字母。
urgency=all&impact=widespread&contentType=image/jpg
可以编码为:
awj
地点:
a在位置0展开为urgency=allw在位置1扩展为impact=widespreadj在位置2展开为contentType=image/jpeg
然后你为该格式编写一个encode()/decode()函数,使其能够处理你在应用程序中想要的真实数据。
你选择什么格式取决于你自己以及正在编码的数据。这些都是“有限列表值之一”类型的参数(即全有或全无)吗?还是有数字参数?无限长度的自由文本字符串?
你对数据的假设越多,你就能将其压缩得越小。你只需要想出一个适合你数据的编码方案。
答案#2
我有一项指令,要通过编写某种哈希来缩短我的应用程序的 URL 行。所以不是这样:
哈希是不可逆的,因此你不能仅使用哈希来缩短你的网址,而不依赖存储。
这个问题通常如何在 JavaScript 中解决?
我不认为这是一个 JavaScript 的“典型”问题,我可以告诉你这与 JavaScript 本身无关。
这是因为你想使用压缩,这是一个与语言无关的问题。
然而,我不认为压缩会对缩短 URL 有多大作用(这取决于 URL 的输入特性,情况可能会有所不同)。
我强烈建议你不要使用压缩,而是使用存储,因为那样你将能够使用哈希。
如果你坚持使用压缩,请在互联网上搜索一个合适的(根据你的需求)压缩算法,然后找到该算法的 JavaScript 实现(对于流行的压缩算法应该不难)。
最后的手段是开发你自己的压缩算法,但既然你在这里问这个很基本的问题,我非常怀疑你有足够的技能去做到这一点。
