2

短い URL アルゴリズムを作成することは、URL をハッシュしてからハッシュをそれ自体の増分バージョンに切り刻むほど簡単ではないことを私は知っています。外部の視点からは、それが起こっているように見えますが。私はこのアイデアに関する記事をいくつか読んだことがあり、実際に動いているカップルも見ました。しかし、誰もそれを将来証明することを心配しているようには見えません.

だから私はここで、PHP でこれにアプローチする方法を見つけようとしており、少なくとも一般的な問題を回避できる方法を見つけようとしています。データベースの競合から、全体的なストレージとデータベースのサイズ以外に心配する必要があるものまで。

私が間違いなく直面する問題の 1 つは、私が作成しているサービスが、友人が作成している別のサービスからユーザー側の URL を取得しているため、ユーザーごとに短い URL を追跡しているため、複数のユーザーがまったく同じ長い URL を使用する可能性があることです。 url ですが、URL を提供するユーザーごとに異なる短い URL ID が必要になります。最近バイラルになったYouTubeビデオを共有している複数のユーザーを考えてみてください..

したがって、同時に多くのbashに直面しない短いURLアルゴリズムを作成するための最良の戦術は、いくつかの可能な短いURLを使用してDBにクエリを実行し、それらが既に存在するかどうかを確認できるようにすることです。

さらに良いのは、mySQL機能を介して一意のIDを作成できるいくつかの手段がありますか?

ここでストローを引っ張っていることは知っていますが、これはかなり未解決の質問です。しかし、私はビルド プロセスに取り掛かる前に、巧妙に考えようとしています。これに対して半健全なアプローチを取っていることを確認する前に、いくつかの入力が必要です。

4

3 に答える 3

1

PHP で作成されたこの短い URL アルゴリズムを使用できます。これは、同じ URL の 4 つの異なる「ハッシュ」を生成します。

のようなテーブルを作成します。

id |    original_url        |   short_url
------------------------------------------
1    http://www.google.com/     tm5kxb

ユーザーが短縮する URL を入力すると、記事の関数を使用して、4 つの異なるハッシュの配列を受け取ります。次に、次のようなクエリを使用できます。

SELECT id FROM {your_table} WHERE short_url = "{a_hash_from_the_function}"

クエリが結果を返さない場合は、一致がなかったことを意味し、これを使用できます。クエリが結果を返す場合は、単に配列から別のハッシュを使用し、それが存在するかどうかを確認します。

著者がハッシュをより予測不可能にする方法を説明しているので、記事全体を読んでください。とは異なるハッシュ アルゴリズムを使用することをお勧めしmd5()ますが、自分で実験する必要があります。:)

于 2012-05-27T10:04:40.490 に答える
0

これが

function shorturl($input) { ... }

上記のSNIPPETITページからの関数、PHPからC#に変換:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

public static List<string> shorturl(string input) {
    var md5 = MD5.Create();
    var base32 = new char[] {
        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
        'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
        'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
        'y', 'z', '0', '1', '2', '3', '4', '5'
    };

    var hex = string.Join("", md5.ComputeHash(Encoding.ASCII.GetBytes(input)).Select(a => a.ToString("x2")));
    var hexLen = hex.Length;
    var subHexLen = hexLen / 8;
    var output = new List<string>();

    for (var i = 0; i < subHexLen; i++) {
        var subHex = hex.Substring(i * 8, 8);
        var @int = 0x3FFFFFFF & Convert.ToUInt32("0x" + subHex, 16);
        var @out = "";
            for (var j = 0; j < 6; j++) {
            var val = 0x0000001F & @int;
            @out += base32[val];
            @int = @int >> 5;
        }

        output.Add(@out);
    }

    return output;
}
于 2012-06-06T23:48:59.237 に答える
0

テーブルurlShortenedがあるとしましょう

id  | url
-----------------
1     http://ecc

両方のフィールドがデータベース内INDEXUNIQUEあるため、URL が既に存在することを知る必要がある場合は、選択するだけです。

SELECT id FROM urlShortened WHERE url  = 'http://anUrl'

これにより、重複した URL も挿入できなくなります

ユーザーごとに一意の URLが必要な場合は、別のフィールドを追加し ( userId)、両方のフィールドに一意のインデックスを作成します ( url,userId) 。

id  | url           | userId
-----------------------------
1     http://site1    1
2     http://site1    2
于 2012-05-27T09:51:18.483 に答える