短地址(ShortUrl)实例

1 篇文章 0 订阅

短地址,就是把长的URL转成短URL, 目前谷歌/新浪/百度/腾讯等都免费提供API服务。因调用次数限制或提供出去的url域名不是想要的,因此考虑自己实现。

短址本质上是实现了一个映射函数 f: X -> Y 。而这个映射函数必须同时具有两个特点:

1. 如果 x1 != x2, 则 f (x1) != f(x2);

2. 对于每一个 y, 能够找到唯一的一个 x 使得 f(x) = y;

对于任何的线性函数,比如 f(x) = 2x,都满足这样的条件。

实现:

短址的长度可以是任意位数,如6,7,8等,而每一位可以由 [a - z, A - Z, 0 - 9, - _] 总共 64 个字母/数字/符号组成的,所以6位的话,总共会有 64^6 ~= 几百亿种组合,足够使用。在百度地图服务中,短址长度为5,如:http://j.map.baidu.com/fSask

本文的思路通过进制之间的转换。规则如下:

0  → a

1  → b

...

25 → z

...

52 → 0

61 → 9

62 → -

63 → _

假设我们用数据库来保存长地址和短地址的映射,那么,在表 ShortURL 中,我们会有三列:

id, integer, auto-increment  //ID,自动增长

long, string, the long URL the user entered  //长URL

short, string, the shortened URL (or just the six characters)  //短URL

长地址生成短地址:

1. 记录写入表 ShortURL ,得到ID

2. 十进制的ID转换成64进制短串,如果约定6位短串的话,不够位数则在前面补0,例如ID=123123 对应的短串为 aaaEdZ

实现如下:

public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";

public static final int BASE = ALPHABET.length();

public static String encode(int num) {

StringBuilder str = new StringBuilder();

while (num > 0) {

str.insert(0, ALPHABET.charAt(num % BASE));

num = num / BASE;

}

int len = str.length();

for (int i = 1; i <= 6 - len; i++) {

str.insert(0, ALPHABET.charAt(0));

}

return str.toString();

}

短地址转长地址:

1. 通过短地址得到ID

2. 通过ID查 ShortURL ,得到长地址

实现如下:

public static int decode(String str) {

int id = 0;

int size = str.length();

for (int i = 0; i < size; i++) {

int value = ALPHABET.indexOf(str.charAt(i));

id += (int) (value * Math.pow(BASE, size - i - 1));

}

return id;

}

实例源码:test2-shorturl

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的Android视频实例: 1. 首先,在你的Android项目中添加以下依赖项: ```gradle implementation 'com.google.android.exoplayer:exoplayer:2.12.1' ``` 2. 在布局文件中添加一个ExoPlayerView来显示视频: ```xml <com.google.android.exoplayer2.ui.PlayerView android:id="@+id/player_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. 在Activity中初始化ExoPlayer: ```java private SimpleExoPlayer player; private PlayerView playerView; private DefaultTrackSelector trackSelector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); playerView = findViewById(R.id.player_view); // 创建一个默认的TrackSelector trackSelector = new DefaultTrackSelector(); // 创建一个ExoPlayer实例 player = ExoPlayerFactory.newSimpleInstance(this, trackSelector); // 将ExoPlayer实例与PlayerView关联 playerView.setPlayer(player); // 准备播放 MediaSource mediaSource = buildMediaSource(); player.prepare(mediaSource); player.setPlayWhenReady(true); } private MediaSource buildMediaSource() { // 创建一个DataSource.Factory,用于创建MediaSource DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "ShortVideoApp")); // 创建一个HlsMediaSource,用于播放HLS格式的视频 return new HlsMediaSource.Factory(dataSourceFactory) .createMediaSource(Uri.parse("https://example.com/short_video.m3u8")); } ``` 4. 如果需要录制视频,你可以使用Android自带的Camera API或第三方库来实现。这里以CameraX为例: ```java private ImageCapture imageCapture; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ... // 初始化ImageCapture imageCapture = new ImageCapture.Builder() .setTargetAspectRatio(AspectRatio.RATIO_16_9) .build(); // 绑定CameraX和ExoPlayer CameraX.bindToLifecycle(this, imageCapture, player); } ``` 5. 当用户点击录制按钮时,你可以在点击事件中调用imageCapture.takePicture()方法来拍摄照片。在照片拍摄完成后,你可以使用ExoPlayer的ConcatenatingMediaSource来将所有的视频连接在一起,实现视频合成: ```java private List<MediaSource> mediaSources = new ArrayList<>(); public void onRecordButtonClicked() { // 拍摄视频 imageCapture.takePicture(new ImageCapture.OnImageCapturedListener() { @Override public void onCaptureSuccess(ImageProxy imageProxy) { // 将拍摄的照片转换为MediaSource MediaSource mediaSource = buildMediaSourceFromImage(imageProxy); // 将MediaSource添加到列表中 mediaSources.add(mediaSource); } }); // 在合适的时机,调用concatenateMediaSources()方法来合成所有的视频 } private void concatenateMediaSources() { // 创建一个ConcatenatingMediaSource,用于合成所有的MediaSource ConcatenatingMediaSource concatenatedSource = new ConcatenatingMediaSource(); // 将所有的MediaSource添加到ConcatenatingMediaSource中 for (MediaSource mediaSource : mediaSources) { concatenatedSource.addMediaSource(mediaSource); } // 将ConcatenatingMediaSource与ExoPlayer关联 player.prepare(concatenatedSource); player.setPlayWhenReady(true); } ``` 以上就是一个简单的Android视频实例。当然,这只是一个基础的框架,你还需要根据自己的需求来进行相应的扩展和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值