GVKun编程网logo

创建自己的Tinyurl样式uid(如何设计tiny url)

56

在这里,我们将给大家分享关于创建自己的Tinyurl样式uid的知识,让您更了解如何设计tinyurl的本质,同时也会涉及到如何更有效地535.TinyURL的加密与解密:设计一个URL简化系统、8、

在这里,我们将给大家分享关于创建自己的Tinyurl样式uid的知识,让您更了解如何设计tiny url的本质,同时也会涉及到如何更有效地535. TinyURL 的加密与解密 : 设计一个 URL 简化系统、8、创建自己的镜像、angularjs – 我自己的角度材料样式ui、CentOS 7手工创建自己的YUM仓库的内容。

本文目录一览:

创建自己的Tinyurl样式uid(如何设计tiny url)

创建自己的Tinyurl样式uid(如何设计tiny url)

我正在写一篇关于Guids / UID的人类可读替代品的小文章,例如TinyURL上用于URL哈希的替代品(通常印在杂志上,因此必须简短)。

我生成的简单uid是-6个字符:小写字母(az)或0-9。

“根据我的计算队长”,这是6个相互排斥的事件,尽管计算冲突的概率要比P(A或B)= P(A)+
P(B)难一些,因为显然它包括数字和在下面的代码中,您可以看到它确定是使用50/50还是数字还是字母。

我对冲突率感兴趣,如果下面的代码是对预期冲突率的真实模拟,则可以从生成哈希中获得。平均而言,每百万我会发生40-50次冲突,但是请记住,uid不会一次生成一百万次,而每分钟可能仅生成10-1000次。

每次发生冲突的可能性是多少,有人可以提出更好的解决方法吗?

static Random _random = new Random();public static void main(){    // Size of the key, 6    HashSet<string> set = new HashSet<string>();    int clashes = 0;    for (int n=0;n < 1000000;n++)    {        StringBuilder builder = new StringBuilder();        for (int i =0;i < 7;i++)        {            if (_random.NextDouble() > 0.5)            {                builder.Append((char)_random.Next(97,123));            }            else            {                builder.Append(_random.Next(0,9).ToString());            }        }        if (set.Contains(builder.ToString()))        {            clashes++;            Console.WriteLine("clash: (" +n+ ")" +builder.ToString());        }        set.Add(builder.ToString());        _random.Next();        //Console.Write(builder.ToString());    }    Console.WriteLine("Clashes: " +clashes);    Console.ReadLine();}

更新: 这是该问题的结果文章

我在这里真的问了两个问题,所以我作弊。我追求的答案是rcar,但是Sklivvz的答案也是第二部分(替代)。是否有可能在数据库中创建自定义的唯一ID生成器,还是在客户端(首先可能进行2次读取)?

我追求的总体思路是在数据库或其他商店中使用Ids,这些ID可以通过电话或印刷材料使用,而不是16字节的巨大GUID。

更新2: 我将两个互斥事件的公式放在两个之上,而不是两个独立的事件(因为第一次获得“ a”并不意味着第二次不能获得“ a”)。应该是P(A和B)=
P(A)x P(B)

答案1

小编典典

与一个特定ID发生冲突的概率为:

p = ( 0.5 * ( (0.5*1/10) + (0.5*1/26) ) )^6

大约是1.7×10 ^ -9。

生成n个ID后发生冲突的可能性为1-p ^
n,因此在插入100万个ID之后,每次新插入都会有大约0.17%的冲突机会,在1000万个ID之后,大约为1.7%。 1亿后约为16%。

1000 ID /分钟的计算量约为每月4300万,因此,如Sklivvz所指出的,在这种情况下,使用递增ID可能是更好的方法。

编辑:

为了解释数学原理,他实际上是在掷硬币,然后拣选一个数字或字母6次。硬币翻转匹配的可能性为0.5,然后有50%的时间有1/10的匹配几率和50%的1/26匹配的几率。该操作独立发生6次,因此您将这些概率相乘。

535. TinyURL 的加密与解密 : 设计一个 URL 简化系统

535. TinyURL 的加密与解密 : 设计一个 URL 简化系统

题目描述

这是 LeetCode 上的 535. TinyURL 的加密与解密 ,难度为 中等

Tag : 「哈希表」、「模拟」

TinyURL 是一种 URL 简化服务, 比如:当你输入一个 URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的URL http://tinyurl.com/4e9iAk

请你设计一个类来加密与解密 TinyURL

加密和解密算法如何设计和运作是没有限制的,你只需要保证一个 URL 可以被加密成一个 TinyURL ,并且这个 TinyURL 可以用解密方法恢复成原本的 URL

实现 Solution 类:

  • Solution() 初始化 TinyURL 系统对象。
  • String encode(String longUrl) 返回 longUrl 对应的 TinyURL
  • String decode(String shortUrl) 返回 shortUrl 原本的 URL。题目数据保证给定的 shortUrl 是由同一个系统对象加密的。

示例:

输入:url = "https://leetcode.com/problems/design-tinyurl"

输出:"https://leetcode.com/problems/design-tinyurl"

解释:
Solution obj = new Solution();
string tiny = obj.encode(url); // 返回加密后得到的 TinyURL 。
string ans = obj.decode(tiny); // 返回解密后得到的原本的 URL 。

提示:

  • $1 <= url.length <= 10^4$
  • 题目数据保证 url 是一个有效的 URL

模拟 + 哈希表

对于每个 longUrl 我们都在「大写字母/小写字母/数字」中随机 $k = 6$ 位作为其映射标识,这需要使用一个哈希表 tiny2Origin 进行记录。

同时了防止相同的 longUrl 多次调用,确保 encode 服务的「幂等性」,我们再额外建立哈希表 origin2Tiny 来记录原串和映射标识的对应关系。

代码:

public class Codec {
    Map<String, String> origin2Tiny = new HashMap<>(), tiny2Origin = new HashMap<>();
    String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    String prefix = "https://acoier.com/tags/";
    int k = 6;
    Random random = new Random();
    public String encode(String longUrl) {
        while (!origin2Tiny.containsKey(longUrl)) {
            char[] cs = new char[k];
            for (int i = 0; i < k; i++) cs[i] = str.charAt(random.nextInt(str.length()));
            String cur = prefix + String.valueOf(cs);
            if (tiny2Origin.containsKey(cur)) continue;
            tiny2Origin.put(cur, longUrl);
            origin2Tiny.put(longUrl, cur);
        }
        return origin2Tiny.get(longUrl);
    }
    public String decode(String shortUrl) {
        return tiny2Origin.get(shortUrl);
    }
}
  • 时间复杂度:encode 操作复杂度为 $O(C + L)$,其中 $C = 6$ 为短串长度,$L$ 为传入参数 longUrl 的长度(存入哈希表需要计算 longUrl 哈希值,该过程需要遍历 longUrl);decode 操作复杂度为 $O(C)$,其中 $L$ 为传入参数 shortUrl 的长度,该长度固定为 prefix 长度加 $6$
  • 空间复杂度:$O(K \times L)$,其中 $K$ 为调用次数,$L$ 为平均 longUrl 长度

最后

这是我们「刷穿 LeetCode」系列文章的第 No.535 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。

在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。

为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSou... 。

在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地

本文由mdnice多平台发布

8、创建自己的镜像

8、创建自己的镜像

所谓的容器实际上是在父镜像的基础上创建了一个可读写的文件层级,所有的修改操作都在这个文件层级上进行,而父镜像并未受影响,如果读者需要根据这种修改创建一个新的本地镜像,有两种不同的方式,第一种方式:commit。

创建容器

首先,根据本地镜像运行一个容器,如下:

在这里插入图片描述


在这里插入图片描述


首先执行 docker images 命令,查看本地镜像。
根据本地镜像中的 Nginx 镜像,创建一个名为 Nginx 的容器,并启动。
将宿主机中一个名为 index.html 的文件拷贝到容器中。
访问容器,发现改变已经生效。
接下来再重新创建一个容器,名为 Nginx2.
访问 Nginx2 ,发现 Nginx2 中默认的页面还是 Nginx 的默认页面,并未发生改变。

commint 创建本地镜像

接下来,根据刚刚创建的第一个容器,创建一个本地镜像,如下:

在这里插入图片描述

参数 -m 是对创建的该镜像的一个简单描述。
–author 表示该镜像的作者。
ce1fe32739402 表示创建镜像所依据的容器的 id。
ss/Nginx 则表示仓库名,ss 是名称空间,Nginx 是镜像名。
v1 表示仓库的 tag。
创建完成后,通过 docker images 命令就可以查看到刚刚创建的镜像。
通过刚刚创建的镜像运行一个容器,访问该容器,发现 Nginx 默认的首页已经发生改变。

在这里插入图片描述


这是我们通过 commint 方式创建本地镜像的方式,但是 commit 方式存在一些问题,比如不够透明化,无法重复,体积较大,为了解决这些问题,可以考虑使用 Dockerfile ,实际上,主流方案也是 Dockerfile。

Dockerfile

Dockerfile 就是一个普通的文本文件,其内包含了一条条的指令,每一条指令都会构建一层。先来看一个简单的例子。

首先在一个空白目录下创建一个名为 Dockerfile 的文件,内容如下:

在这里插入图片描述

FROM Nginx 表示该镜像的构建,以已有的 Nginx 镜像为基础,在该镜像的基础上构建。

MAINTAINER 指令用来声明创建镜像的作者信息以及邮箱信息,这个命令不是必须的。

RUN 指令用来修改镜像,算是使用比较频繁的一个指令了,该指令可以用来安装程序、安装库以及配置应用程序等,一个 RUN 指令执行会在当前镜像的基础上创建一个新的镜像层,接下来的指令将在这个新的镜像层上执行,RUN 语句有两种不同的形式:shell 格式和 exec 格式。本案例采用的 shell 格式,shell 格式就像 linux 命令一样,exec 格式则是一个 JSON 数组,将命令放到数组中即可。在使用 RUN 命令时,适当的时候可以将多个 RUN 命令合并成一个,这样可以避免在创建镜像时创建过多的层。

copY 语句则是将当前目录下的 hello.html 文件拷贝到镜像中

文件创建完成后,执行如下命令进行构建:

在这里插入图片描述

-t 参数用来指定镜像的命名空间,仓库名以及 TAG 等信息。

最后面的 . 是指镜像构建上下文。

注意:Docker 采用了 C/S 架构,分为 Docker 客户端(Docker 可执行程序)与 Docker 守护进程,Docker 客户端通过命令行和 API 的形式与 Docker 守护进程进行通信,Docker 守护进程则提供 Docker 服务。因此,我们操作的各种 docker 命令实际上都是由 docker 客户端发送到 docker 守护进程上去执行。我们在构建一个镜像时,不可避免的需要将一些本地文件拷贝到镜像中,例如上文提到的 copY 命令,用户在构建镜像时,需要指定构建镜像的上下文路径(即前文的 . ), docker build 在获得这个路径之后,会将路径下的所有内容打包,然后上传给 Docker 引擎。

然后根据这个镜像创建容器并启动,就可以看到之前的内容了。

在这里插入图片描述

在这里插入图片描述

angularjs – 我自己的角度材料样式ui

angularjs – 我自己的角度材料样式ui

material-ui我想自定义它.不幸的是,我自己的风格被框架样式覆盖了.例如,当我为md-toolbar声明样式时
md-toolbar {
    background: red;
}

该声明被材料覆盖.我添加了!重要指令,它有所帮助,但我不想在任何地方使用它.我该如何以适当的方式定制材料?

我知道的最好的方法,没有重新编译,sass等:

您应该应用自定义主题:

angular.module('myApp').config(['$mdThemingProvider',function($mdThemingProvider) {
    $mdThemingProvider.theme('myAwesome')
        .primaryPalette('blue')
        .accentPalette('cyan')
        .warnPalette('red');
    $mdThemingProvider.setDefaultTheme('myAwesome');
}]);

之后元素获得class:md-myAwesome-theme,这样你就可以在你的css(或更少)文件中添加样式:

md-select.md-myAwesome-theme {
    margin: 0;
    padding: 0;
}

CentOS 7手工创建自己的YUM仓库

CentOS 7手工创建自己的YUM仓库

一、简介

在linux系统上安装软件有三种方式,一、源代码形式,绝大多数开源软件都是直接以源代码的形式发布,一般被打包成tar.gz的归档压缩文件,这种源代码形式的程序需要编译成二进制形式之后才能够运行使用,这种形式虽然兼容性、可控性较好,但使用起来较为麻烦,有大量的依赖关系需要解决;二、RPM安装包,RPM通过将源代码基于特定平台系统编译成可执行文件,并保存依赖关系,简化了开源软件的安装,但依然需要手工解决依赖关系;三、YUM软件管理,YUM设计的主要目的就是自动解决RPM的依赖关系,可以对RPM进行分组,引入仓库(repo)概念并支持多个仓库,配置比较简单。

YUM使用仓库保存管理RPM软件包,仓库的配置文件保存在/etc/yum.repos.d/目录下,CentOS自带的配置文件如下:

将这几个文件删除,rm -rf CentOS* 或则移除该文件夹 mv CentOS* /yum。

二、手工配置YUM仓库

1、将所有rpm软件包拷贝到一个文件夹下,这里我们使用CentOS 7自带的rpm软件包,在VMware物理机无法联网的情况下可以使用。将CentOS7安装镜像挂载在CentOS下,文件默认路径在/run/media/centostest/下,CentOS6保存在/media/下,这里centostest为自己的用户名,rpm软件包保存在镜像文件Packages文件夹下。

建立一个文件夹并拷贝,拷贝时间会比较长,虚拟光盘的话会快一点。

2、通过rpm命令安装createrepo软件,createrepo软件包就包含在前面拷贝的rpm文件内。

安装createrepo软件,软件名称通过Tab键可以自动补全。

3、运行createrepo命令建立索引

完成后会在yum-packages文件夹下建立一个repodata的文件夹,里面保存索引信息。

4、添加配置文件

在/etc/yum.repos.d/文件夹下添加配置文件。

这里进行了最简单的配置,[centos]、name 任意取名字就行,enabled、gpgcheck可配置也可不配置。

5、清空YUM Cache

使用yum clean all命令清空,并用yum list命令查看yum库

可以看到自己建立的yum仓库信息

这里的centos为[centos]里面的名字。

关于创建自己的Tinyurl样式uid如何设计tiny url的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于535. TinyURL 的加密与解密 : 设计一个 URL 简化系统、8、创建自己的镜像、angularjs – 我自己的角度材料样式ui、CentOS 7手工创建自己的YUM仓库等相关知识的信息别忘了在本站进行查找喔。

本文标签: