1

I've read a similar question and Raymond Chan's blog post, but still have a question around using a shortened GUID as an id. I understand that GUIDs are unique, but substrings of GUIDs are not.

I am building a site that supplies the user with a reference number for an order. The client does not want to use an auto-incremented Int, as this will expose the total number of orders. They also consider GUIDs too long and difficult to repeat over the phone.

However, as we will only have one web server, it has been suggested that we can use the non-MAC address part of a GUID, to give a shorter, unique identifier.

My understanding is that the current GUID algorithm does not allow for this. Is this correct? Can GUIDs created on the same machine be shortened yet still unique?

4

2 に答える 2

2

自動インクリメントされたint(10000から開始)を使用して、暗号化された読みやすい/見つけにくい文字列にコード化することもできます。これは、結果が高速の一意の番号であることを保証します。

たとえば、これを実行できるコードは次のとおりです

https://stackoverflow.com/a/5901201/159270

といくつかのサンプル結果。

value: 9999999999 encoded: SrYsNt
value: 4294965286 encoded: ZNGEvT
value: 2292964213 encoded: rHd24J
value: 1000000000 encoded: TrNVzD

また、暗号化するために必要なのは文字コード表をスクランブルすることだけです。通常のユーザーは数字が少なく、関係を知らないため、それらを再作成することはできません。

さて、Guidを使用して、切り取ることができるものを検索する場合は、そのソースコードを次に示します:http://www.webdav.org/specs/draft-leach-uuids-guids-01。 TXT

このソースコードでは、そのビルドがどのように組み込まれているかを確認できます。次に、TimeStamp +乱数を使用して、上記のように再度変換することを考えます。

于 2012-05-20T12:06:40.900 に答える
1

この投稿はあなたの問題に対処し、解決策も教えてくれると思います。

http://madskristensen.net/post/Generate-unique-strings-and-numbers-in-C.aspx

上記のリンクから取得しています。

System.Guidは、一意のキーを生成する必要がある場合は常に使用されますが、非常に長くなります。多くの場合、これは問題ではありませんが、URLの一部であるWebシナリオでは、36文字の長さの文字列表現を使用する必要があります。それはURLを乱雑にし、基本的に醜いです。

GUIDの一意性をいくらか失うことなく短縮することはできませんが、代わりに16文字の文字列を受け入れることができれば、長い道のりを歩むことができます。

標準のGUID文字列表現を変更できます。

21726045-e8f7-4b09-abd8-4bcc926e9e28

短い文字列に:

3c4ebc5f5f2c4edc

次のメソッドは短い文字列を作成しますが、実際には非常にユニークです。1000万回の反復では、重複は作成されませんでした。GUIDの一意性を使用して文字列を作成します。

private string GenerateId()
{
 long i = 1;
 foreach (byte b in Guid.NewGuid().ToByteArray())
 {
  i *= ((int)b + 1);
 }
 return string.Format("{0:x}", i - DateTime.Now.Ticks);
}

文字列の代わりに数字が必要な場合は、それを行うことができますが、最大19文字にする必要があります。次のメソッドは、GUIDをInt64に変換します。

private long GenerateId()
{
 byte[] buffer = Guid.NewGuid().ToByteArray();
 return BitConverter.ToInt64(buffer, 0);
}

標準のGUIDは、100%一意ではありませんが、一意性を確保するための最良の方法です。

于 2012-05-20T12:05:03.387 に答える