2013-02-21 22 views
11

Tôi đang tích hợp/thử nghiệm với dịch vụ web từ xa và mặc dù đó là điểm cuối "QA", nó vẫn thực thi một địa chỉ email duy nhất trên mỗi cuộc gọi.Cách tạo số duy nhất không lặp lại trong thời gian hợp lý?

Tôi có thể nghĩ đến DateTime.Now.Ticks (ví dụ: 634970372342724417) và Guid.NewGuid(), nhưng không ai trong số đó có thể được kết hợp vào email với CPC 20 ký tự (hoặc có thể chúng?).

Tôi cho rằng không khó để viết ra một tệp có chứa số cuối cùng được sử dụng và sau đó sử dụng [email protected], [email protected], etc... nhưng nếu tôi có thể tránh trạng thái kiên trì mà tôi luôn làm.

Có ai có mẹo hay thuật toán cung cấp một cái gì đó có độ dài ngắn "guid" duy nhất trong khoảng thời gian dài hợp lý (nói một năm) mà tôi có thể sử dụng cho địa chỉ email của mình có độ dài tối đa 20 ký tự (chiều dài tối đa của guid) = 14 = 20 - chiều dài của "@ x.com"?

+0

Bạn gửi yêu cầu bao lâu một lần? – AbZy

+0

Nó không phải là một thử nghiệm tải. Có ít nhất một giây giữa các cuộc gọi –

+0

http://stackoverflow.com/questions/4421442/generate-8-digit-uinque-id-in-c-sharp Câu trả lời của Jon Skeet có thể hữu ích cho trường hợp của bạn –

Trả lời

15

Nếu bạn cho rằng bạn sẽ không tạo hai địa chỉ email cùng một lúc 'đánh dấu', thì bạn thực sự có thể sử dụng các dấu tích để tạo địa chỉ email.

Tuy nhiên, nếu ve là số 64 bit và bạn viết số đó, bạn sẽ kết thúc với hơn 20 ký tự.

Bí quyết là mã hóa số 64 bit của bạn bằng cách sử dụng một lược đồ khác. Giả sử rằng bạn có thể sử dụng 26 ký tự từ bảng chữ cái phía tây + 10 chữ số. Điều này làm cho 36 ký tự có thể. Nếu bạn mất 5 bit, bạn có thể đại diện cho 32 ký tự. Điều đó là đủ. Lấy 64 bit và chia chúng thành các nhóm 5 bit (64/5 là khoảng 13 nhóm). Dịch mỗi 5 bit thành một ký tự. Bằng cách đó bạn kết thúc với 13 ký tự, và bạn vẫn có thể thêm một nhân vật ở phía trước của nó).

long ticks = DateTime.Now.Ticks; 
byte[] bytes = BitConverter.GetBytes(ticks); 
string id = Convert.ToBase64String(bytes) 
         .Replace('+', '_') 
         .Replace('/', '-') 
         .TrimEnd('='); 
Console.WriteLine (id); 

Sản lượng:

Gq1rNzbezwg 
+0

Tôi đang trên bờ vực của nhận được câu trả lời của bạn để làm việc bằng cách chuyển đổi ve để base64 .. chỉ cần tìm ra những gì phải làm với '+' và '/' ... –

+0

ahh .. tôi sẽ chuyển đổi chúng thành ' _ 'và' -'... –

+1

tôi đã chỉnh sửa câu trả lời của bạn để chứa mã mà tôi đã thực hiện theo đề xuất của bạn .. –

10

Kể từ khi bạn đã xác định ít nhất 1 giây giữa mỗi cuộc gọi, điều này sẽ làm việc:

DateTime.Now.ToString("yyyyMMddHHmmss"); 

của nó chính xác 14 ký tự.

+0

Điều này sẽ được giới hạn trong một email duy nhất mỗi giây thông qua ... –

+1

@VenomFangs yep, xem nhận xét OP về câu hỏi. 'Nó không phải là một thử nghiệm tải. Có ít nhất một giây giữa các cuộc gọi số – AbZy

+1

cuộc gọi tốt mà tôi đã bỏ lỡ điều đó. –

6

Nếu bạn nhận được các chữ số sau kể từ ngày-thời gian của bạn, bạn sẽ có thể để làm cho nó làm việc ... soemthing như:

DateTime.Now.ToString("yyMMddHHmmssff"); 

đó là 16 ký tự, để lại 4 đối với một số tiền tố khác như bạn cần.

Vì vậy, ngày 21 tháng 2 năm 2013, vào khoảng 10:21 sẽ là "130.321.102.142" và tiếp theo sẽ là "130.321.102.169", vv ...

Có một cái nhìn tại http://msdn.microsoft.com/en-us/library/zdtaw1bw.aspx để biết thêm chi tiết về định dạng datetime .

+0

+1 để sử dụng yy và ff. Nhưng có một cơ hội nhỏ sẽ có bản sao nếu bạn sử dụng hh chứ không phải HH. – AbZy

+1

Yea, đó là mẫu mã không được kiểm tra. Khi có thể tôi muốn ném những thứ này vào dự án phòng thí nghiệm của mình chỉ để đảm bảo chúng hoạt động như được quảng cáo. Bất kể - câu trả lời cập nhật cho người dùng HH. – EtherDragon

0

Chỉ cần thêm ... Nếu bạn muốn sử dụng số chỉ từ ve, bạn có thể bằng cách sử dụng substring, ví dụ:

int onlyThisAmount = 20; 
string ticks = DateTime.Now.Ticks.ToString(); 
ticks = ticks.Substring(ticks.Length - onlyThisAmount); 
0
/// <summary> 
    /// Get a unique reference number. 
    /// </summary> 
    /// <returns></returns> 
    public string GetUniqueReferenceNumber(char firstChar) 
    { 
     var ticks = DateTime.Now.Ticks; 
     var ticksString = ticks.ToString(); 
     var ticksSubString = ticksString.Substring((ticksString.Length - 15 > 0) ? ticksString.Length - 15 : 0); 
     if (this.currentTicks.Equals(ticks)) 
     { 
      this.currentReference++; 

      if (this.currentReference >= 9999) 
      { 
       // Only when there are very fast computers. 
       System.Threading.Thread.Sleep(1); 
      } 

      return (firstChar + ticksSubString + this.currentReference.ToString("D4")).PadRight(20, '9'); 
     } 

     this.currentReference = -1; 
     this.currentTicks = ticks; 
     return (firstChar + ticksSubString).PadRight(20, '9'); 
    } 

Trong trường hợp của tôi, tôi cần tạo một số tham chiếu duy nhất với ký tự đầu tiên duy nhất và tối đa 20 ký tự.Có lẽ bạn có thể sử dụng chức năng dưới đây, nó cho phép bạn tạo 9999 số duy nhất trong một lần đánh dấu. (không bao gồm)

Tất nhiên bạn có thể tạo triển khai của riêng mình mà không có ký tự đầu tiên và số ký tự tối đa là 20

Các vấn đề liên quan