栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

像goo.gl或jsfiddle这样的网站如何生成其URL代码?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

像goo.gl或jsfiddle这样的网站如何生成其URL代码?

基于随机子字符串的解决方案不好,因为输出会发生冲突。它可能会过早发生(运气不好),并且最终会在生成的值列表变大时发生。冲突的可能性甚至不必变得很大(请参阅生日攻击)。

对这个问题有好处的是,递增ID与对应ID之间的伪随机置换将显示在URL中。该技术保证了碰撞是不可能的,同时仍会生成与输入空间一样小的输出空间。

实作

我建议此Feistel密码的
C#版本具有32位块,3个回合和一个受伪随机生成器启发的 回合函数

private static double RoundFunction(uint input){    // Must be a function in the mathematical sense (x=y implies f(x)=f(y))    // but it doesn't have to be reversible.    // Must return a value between 0 and 1    return ((1369 * input + 150889) % 714025) / 714025.0;}private static uint PermuteId(uint id){    uint l1=(id>>16)&65535;    uint r1=id&65535;    uint l2, r2;    for (int i = 0; i < 3; i++)    {        l2 = r1;        r2 = l1 ^ (uint)(RoundFunction(r1) * 65535);        l1 = l2;        r1 = r2;    }    return ((r1 << 16) + l1);}

要在base62字符串中表达置换的ID:

private static string GenerateCode(uint id){    return Tobase62(PermuteId(id));}

base62
函数与上一个答案相同,除了要用
uint
代替
int
(否则,必须重写这些函数以处理负值)。

定制算法

RoundFunction
是该算法的秘诀。您可以将其更改为非公开版本,其中可能包含密钥。Feistel网络具有两个非常好的属性:

  • 即使所提供的

    RoundFunction
    是不可逆的,该算法也保证这
    PermuteId()
    将是数学意义上的排列(这意味着零碰撞)。

  • 即使在圆角函数内部稍稍更改表达式,也会大大改变最终输出值列表。

要注意的是,尽管在每个

PermuteId
输出的唯一性方面仍然可以正常工作,但在舍入表达式中添加一些琐碎的东西会破坏伪随机效果。而且,从数学意义上讲不是函数的表达式将与算法不兼容,因此例如
random()
不允许涉及任何内容。

可逆性

在当前形式下,

PermuteId
函数是其自身的逆函数,这意味着:

PermuteId(PermuteId(id))==id

因此,给定程序产生的短字符串,如果

uint
使用
Frombase62
函数将其转换回,并将其作为输入提供给
PermuteId()
,则它将返回相应的初始ID。如果您没有用于存储[内部ID
/短字符串]关系的数据库,那就太酷了:实际上并不需要存储它们!

产生更短的弦

以上函数的范围是32位,即从0到大约40亿个值

2^32-1
。要在base62中表示该范围,需要6个字符。

仅用5个字符,我们就可以希望最多代表

62^5
10亿以下的值。如果输出字符串限制为5个字符,则应对代码进行如下调整:

  • 找出

    N
    这样一个
    N
    偶数,
    2^N
    并尽可能高但低于
    62^5
    。那是28,所以我们适合的实际输出范围
    62^5
    将是
    2^28
    大约2.68亿个值。

  • 在中

    PermuteId
    ,请使用和而不是16位的
    28/2=14
    位值,同时注意不要忽略输入的单个位(其必须小于2 ^ 28)。
    l1``r1

  • 将结果乘以

    RoundFunction
    16383而不是65535,以保持在14位范围内。

  • 在的末尾

    PermuteId
    ,重新组合
    r1
    l1
    形成一个
    14+14=28
    位值,而不是32。

相同的方法可以应用于4个字符,输出范围为

2^22
,或约400万个值。

它是什么样子的

在上述版本中,以id = 1开头的前10个生成的字符串为:

cZ6ahF3t5mMxGNPNdxwUdSej9SyVcmbVG3cOlRkcbfCPOXJDr8Qeg7iuA

如果我对round函数进行微不足道的更改,则变为:

ey0LlYddy0akdw3wmbVuNbgbKGX22c0s5GZdfNMSpZySqEcxKH4bdNqMDA


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/446557.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号