Asla aynı değeri iki kere döndürmemeyi garanti eder [kapalı]


23

Bu bir iş görüşmesinde sorulduğum bir soru ve aradıkları cevabı bulamıyorum, bu yüzden burada birilerinin bazı fikirleri olabileceğini umuyorum. Amaç, aynı değeri asla iki kez döndürmeyecek garantili bir işlev yazmaktır. Bu işleve aynı anda birden fazla makine tarafından erişileceğini varsayalım.

Benim fikrim, her makineye benzersiz bir kimlik atamak ve bu değeri benzersiz değer üreteci işlevine aktarmaktı:

var i = 0;
function uniq(process_id, machine_id) {
   return (i += 1).toString() + machine_id + "-" + process_id;
}

Bu, iki veya daha fazla işlem için aynı değeri okuduğunda bile i, her dönüş değerinin benzersiz bir işlem kimliği ve makine kimliği birleşimi olarak etiketlendiğinden , yarış koşullarından kaçınması önlenir . Bununla birlikte, görüşmecim bu cevabı beğenmedi, çünkü başka bir makineyi çevrimiçi duruma getirmek bir kimlik vermeyi içeriyor.

Herhangi biri, her bir makinenin benzersiz bir kimliğe göre yapılandırılmasını gerektirmeyen, bunu çözmenin başka bir yolunu düşünebilir mi? Bu sorunun tekrar ortaya çıkması durumunda bir cevap almak istiyorum. Teşekkürler.


31
Kelimenin tam anlamıyla garantili? Yani, Kılavuzlar bile bir noktada kendilerini tekrar etmeye başlayacak. Artık yaşayabiliriz, ama garantileriz ... Bu arada, bir süreç kimliği benzersiz olmaktan uzak .
JensG

7
@CodesInChaos - Bazı işletim sistemlerinde mac adresinizi değiştirmenin önemsiz olduğu düşünüldüğünde, oldukça korkunç bir varsayımdır.
Telastyn

7
"Bu işleve aynı anda birden fazla makine tarafından erişileceğini varsayalım" - dürüst olmak gerekirse, bu "kodun her makine üzerinde ayrı ayrı çalıştığı, makineler arasında iletişim kurulamadığı" veya "işlevin merkezi bir makine / merkezi veritabanı olduğu anlamına gelebilir" Ağ üzerinden temin edilebilen diğer makineler için sağlanmıştır ". Önce bunu açıklamaya başlamalısınız.
Doktor Brown

28
Bu hileli bir soru muydu? Örneğin, sonsuz bir döngü içeren bir fonksiyon asla aynı değeri iki kez döndürmez ..
Brendan

8
Belki de varsayımlarda bulunmak ve onunla çalışmak yerine şüpheli şartlar hakkında sorular soran bir programcı arıyorlardı :)
32'de

Yanıtlar:


60

Fantezi almayın, sadece bazı iletişim uç noktalarının (WCF, web servisi, ne olursa olsun) arkasına basit bir (iş güvenliği) sayacı atın:

   long x = long.MinValue;
   public long ID(){
       return Interlocked.Increment(ref x);
   }

Evet, sonunda taşacak. Evet, yeniden başlatma işlemlerini gerçekleştirmiyor. Evet, rastgele değil. Evet, birisi bunu birden çok sunucuda çalıştırabilir.

Pratik gereklilikleri karşılayan en basit şey budur. Öyleyse onların bu problemleri takip edenleri olmalarına izin verin (sınırlamaları anladıklarından emin olmak için, gerçekten 2 ^ 64 kimlikten daha fazlasına ihtiyacınız olduğunu düşünüyorlar mı?), Böylece hangi takasların uygun olduğunu sorabilirsiniz. Yeniden başlatmaya devam etmek mi gerekiyor? Peki ya sabit disk arızası? Peki ya nükleer savaş? Rastgele olması gerekiyor mu? Ne kadar rastgele?


7
Bu iyi bir cevaptır, çünkü görüşmeci asla doğru bir cevap almak için soru sormaz. Kararlarını haklı gösterebileceğin bir cevap vermeni istiyorlar. Etki alanını anlarsanız, haklı çıkarabilirseniz neredeyse tüm cevaplar uygun olacaktır.

7
Kod farklı makinelerde çalışıyorsa (bu nedenle farklı işlemlerde açıkça görülürse) bunun nasıl çalışması gerekiyor ? Her işlemin farklı bir kopyası olacaktır x. Ve bence aklınızdaki kilitleme mekanizması hakkında bir açıklama yapmadan, bu cevap oldukça belirsizdir.
Doktor Brown

7
@DocBrown "aynı anda birden fazla Makine tarafından erişildi", birden fazla makinenin tek bir sunucu üzerinde tek bir işleve eriştiği anlamına gelir . Aksi taktirde "Birden fazla makine aynı anda bu işlevin bir kopyasını çalıştıracak" ifadesi verilmelidir
Falco

3
@LightnessRacesinOrbit: Bunun C # ve System.Threading.Interlockedatomik artışlar sağlayan sınıf olduğu anlamına geliyor . Ancak bu bir tür sahte kod olarak da okunabilir.
Doktor Brown,

3
Bunu soran kişi olsaydım bu tekliften çok mutsuz olurdum. Gereksinimlerin ne olduğunu bile bilmeden bir şeyi uygulamaya başlamak büyük bir kırmızı bayraktır. Sormanı bekliyorum.
JensG

25

Bana bu soruyu sordular ve yeniden başlatmalar arasında ve farklı makineler arasında benzersiz olmaları gerektiğini açıkladılarsa, onlara ne olursa olsun, yeni bir GUID oluşturmak için standart mekanizmaya çağıran bir işlev verirdim. kullanılan dil.


V4 GUID'lerinde sorun, yalnızca benzersiz olmaları, benzersiz garantili olmalarıdır. Uygulamada büyük bir sorun değil, ancak görüşmeci gerçek anlamda bunları alırsa gereklilikleri yerine getirmiyor.
KodlarInChaos

Özellikle, standart GUID mekanizması, görüşmecinin gereksinimlerini karşılamıyorsa, görüşmeci ile GUID'lerin sıradan bir kullanıcısı arasındaki gereksinimlerdeki farkları ortadan kaldırın. Bir mantıklı ( "sen <olağan gereksinimlerinden küçük bir değişiklik ile belki bazı genel bilinen standart şeyi> do nasıl") sorusuna bu tür soran Görüşmeci sanatın durumu hakkında bilmek adaylar arasından cevabın çok farklı türde beklemelidir sıfırdan bir şey icat eden GUID'ler ve adaylar için.
Steve Jessop

Bu muhtemelen esnek gereksinimler varsayarak en basit cevaptır.
Mayer

9
+1 çünkü bu temelde kılavuzların çözdüğü problemdir. İkili bir Guid üretmek, formatı ne olursa olsun, gezegendeki en zor piyangodur. Görünüşe göre birçok insan, üssel çarpışma ihtimaline karşı bir anlayışa sahip değil.
usr

3
Oh, ve eğer böyle bir sorunun cevabını "standart bir fonksiyon kullan" seçeneğini sunarsanız, bir takip sorusu bekleyin "ve standart fonksiyon nasıl uygulanır?". Çok iyi cevap verebileceğiniz, "Bilmiyorum, ama bir şeyi icat etmeye çalışmak yerine kesinlikle ararım", bu da görüşme koşullarında beklenen inançsızlığın askıya alınmasını tamamen sağlayamayan, tamamen doğru bir cevap, Eğer edeceğimi hiç yapmak şey ;-) önce onu araştırma olmadan önemli
Steve Jessop

22

Görüşmeci, yöntemin paralel değil eşzamanlı olarak çağrılacağını söyledi; tarihi / saati mümkün olduğunca çok sayıda ondalık basamağa döndürmeniz yeterlidir.

Neden herkes bunu fazla düşünüyor? Herhangi bir sonluluğun süresi dolmadan çok uzun zaman önce ölmüş olacaksınız ve bir çarpışma şansınız yok.

Aynı zamanda geri dönmesinden endişe ediyorsanız, en düşük ölçülebilir süre için bir gecikme ekleyin.

Gün ışığından yararlanma saati için bir saatin ayarlanması konusunda endişe duyuyorsanız (iki kez 1 kez deneyimleyin), onu ikinci deneyimlediğiniz zamana bir sabit ekleyin.


12
Veya isteklilerin saat diliminden bağımsız olarak sadece UTC saatini döndürün. UTC yerelleştirilmediğinden DST değişikliklerinden etkilenmeyecektir.
Mauro

1
System.currentTimeNanos () :-)
Falco

1
Tarih ve saati insan tarafından okunabilir bir biçimde geri göndermediğiniz sürece, değerinizde hiçbir zaman dilimi bilgisi bulunmamalıdır.
Monica

12
En küçük zaman, hala yeterince / eşzamanlı olarak aranırsa çarpışmalara neden olacaktır. Aynı zamanda saat senkronizasyonu kayması, kötü niyetli saat manipülasyonu ve dikkatli değilseniz, gün ışığından yararlanma nedeniyle çarpışmalara neden olur.
Telastyn

1
En azından çok yaratıcı. Her zaman ayarlanacak olan bir saate güvenmek ve o zaman hala iyi bir fikir değil, IMHO. Ofset sizi çarpışmalardan kurtarmayacak.
JensG

15

Öncelikle, görüşmeciye iki soru sormak isteyeceksiniz.


Soru 1.

görüşmeci , bazı benzersiz numaralar veya benzersiz numaralar blokları atamak için bir veya daha fazla "merkezi makine" bekliyor mu .


Soru 2.

Görüşmeci olsun beklediğini çarpışma tespiti için bir mekanizma veya onun yerine bunları açıkça tespit etmeden çarpışma bir ufacık şans hesaplanan riskin kabul edin.

Ayrıca, kullanıcı kimliğinin bir bölümünü rasgeleliğe dahil eden derinlemesine savunma yaklaşımı da vardır (bu nedenle tamamen rastgele değildir). Aynı kullanıcının, aynı kullanıcı tarafından yaratılan içerikte bir çarpışma ile karşılaşması ihtimali bu nedenle azalır.


Örtük bir soru var 3, ...

Ama sormadan kendin ölçmek zorunda kalacaksın, çünkü görüşmecine sorman çok kaba.

Görüşme yapan kişinin, kriptografik ve bilgi güvenliği sistemlerinde kullanılan olasılık, risk ve bazı basit teknikleri bilmesi durumunda.

İlk bilgi türü, bilimsel olmayan bir kişiyi kabul etmeyecekleri bir bilimsel kavramı kabul etmeye ikna etmeye çalışmamanızı sağlar.

İkinci tür bilgiler, yalnızca olasılığa ek olarak kaygıları gidermenizi sağlar. Başka bir deyişle, iki makineyi aynı değeri üretmeye zorlamak için, makinelerini veya sanal ana bilgisayarlarını manipüle ederek kasıtlı olarak randomizasyon planınızı bozmak isteyen "saldırganlara" karşı nasıl savunma yapılacağı.


Neden sordun.

Bunun nedeni, görüşmecinin bir şekilde veya başka bir şey beklemesi durumunda, karşı yaklaşımla cevap vermeye çalışmak, görüşmeciyi asla mutlu etmeyecektir.

Daha derin olan sebep, bazı insanların 1.0e-20başarısız olma şansı olarak söyleme fikrinden hoşlanmamasıdır . (Burada felsefi veya dini argümanları karıştırmamaya çalışacağım.)


Öncelikle, rastgele sayıların "ad alanı", bir rastgele kaynağa tahsis edilmiş belirli bit sayısı ve diğer yollara tahsis edilmiş diğer bit sayısı vb. İle bir hiyerarşi içinde yapılır.

Merkezi yaklaşım, ilk seviye bitleri benzersiz şekilde atamak için bazı merkezi otoritelere dayanır. Ardından, diğer makineler bitlerin geri kalanını doldurabilir.

Birkaç ademi merkeziyetçi yaklaşım var:

  • Sadece olabildiğince iyi rastgele sayılar üretin ve hesaplamalar tarafından gerekçelendirilmenin pratik olarak sıfır başarısızlık olasılığını kabul edin.
  • Deterministik bir kaynaktan rasgele değerler elde etmek için kriptografik araçlar kullanın, örneğin bir artan değerler.

Bence bu en iyi cevap. Diğerleri şartsız çözümlerdir.
Jack Aidley

Üçüncü sorunuza değinmek - bu yeterliliğin güvenli bir varsayım veya en azından ilgisiz olduğu gibi görünüyor. Eğer bir şirket yetkili bir görüşmeci sağlamıyorsa, seçim sürecinde daha büyük hatalar olacaktır. Onlar yaptıysa, o zaman soruları takdir edecektir.
Mayer

1
Neden “3. soruya”, “Gerçekten garantili benzersizliğe mi, yoksa sadece çok, çok düşük bir çarpışma olasılığına mı ihtiyacımız var?” Diye bir şey sorularak cevap verilemedi. ve "Bunun ne kadar güvenli olması gerekiyor? Bir saldırganın mekanizmayı kırmaya çalışacağını varsaymalı mıyız? Ne tür saldırılarla ilgileniyoruz?" Bu soruların cevapları, sorunun bu sorunları anlayıp anlamadığını ve ne beklediğini netleştirmelidir.
jpmc26

12

Dolayısıyla, bunun bir röportaj sorusu olduğunu ve gerçek bir gerçek yaşam senaryosu olmadığını göz önünde bulundurarak doğru yaklaşımın (ve muhtemelen anketörün aradığı şeyin) netleştirici bir soru sormak ya da yazmak olduğunu düşünüyorum. bitmiş "ve devam et. İşte nedeni.

Mülakatçı Ne İstedi:

Asla aynı değeri iki kez döndürmemeyi garanti eden bir fonksiyon yazın. Bu işleve aynı anda birden fazla makine tarafından erişileceğini varsayalım.

Mülakatçının İhtiyacı Olan:

Bu aday gereksinimleri etkili bir şekilde değerlendirir ve gerektiğinde ilave girdi ister mi?

Asla varsayma.

Bir mühendis bir gereksinimi ele aldığında (bir SOW veya Spesifikasyon veya başka bir gereksinim belgesi aracılığıyla), bazıları açıktır ve diğerleri tamamen belirsizdir. Bu, ikincisinin mükemmel bir örneği. Önceki cevapların göstermiş olduğu gibi, (a) sorunun niteliğine ilişkin olarak ya da (b) sistemin niteliğine ilişkin birkaç önemli varsayımlarda bulunmadan bu gereksinime cevap vermenin bir yolu yoktur, çünkü gereklilik yerine getirilemez. yazıldığı gibi (mümkün değildir).

Cevapların çoğu sorunu bir dizi varsayım yoluyla çözme girişiminde bulundu. Biri, hızlıca halletmesini ve yanlış olması durumunda müşterinin endişelenmesini bekler.

Bu gerçekten kötü bir yaklaşım. Bir müşteri olarak, net olmayan bir gereklilik verirsem ve mühendis gider ve bana işe yaramaz bir çözüm geliştirirse, işe gitmeleri ve ilk önce bana sormadan rahatsız olmadan paramı harcadıkları için üzgün olacağım. Bu tür bir şövalye karar vermesi, ekip çalışması eksikliği, eleştirel düşünememe ve kötü karar vermeyi gösterir. Güvenlik açısından kritik bir sistemde can kaybı da dahil olmak üzere her türlü olumsuz sonuca yol açabilir.

Neden Soru Sor?

Bu alıştırmanın, belirsiz gereksinimlere göre inşa edilmesinin pahalı ve zaman alıcı olduğu anlamına gelir. OP'nin durumunda, size imkansız bir görev verildi. İlk işleminiz açıklığa kavuşturmak için sorulmalıdır - gerekli olan nedir? Ne dereceye kadar benzersizliğe ihtiyaç var? Bir değer benzersiz değilse, ne olur? Bu soruların cevabı birkaç hafta ile birkaç dakika arasındaki fark olabilir. Gerçek dünyada, karmaşık sistemlerdeki (çoğu yazılım sistemi de dahil olmak üzere) maliyetlerin en büyük itici güçlerinden biri belirsiz ve anlaşılamamış gereksinimlerdir. Bu, proje yeterince büyükse, pahalı ve zaman alıcı hatalara, yeniden tasarımlara, müşteri ve ekip sıkıntılarına ve medya kapsamını benimsemeye yol açar.

Farz edince ne olur?

Havacılık endüstrisindeki geçmişim ve havacılık başarısızlıklarının son derece görülebilir doğası nedeniyle, önemli noktaları göstermek için bu alandan örnekler getirmeyi seviyorum. Mars İklim Orbiter ve Mars Polar Lander - Başarısız bir çift Mars görevini inceleyelim. Her iki görev de yazılım sorunlarından dolayı başarısız oldu - çünkü mühendisler, kısmen belirsiz ve kötü iletilen gereksinimler nedeniyle geçersiz varsayımlarda bulundular.

Mars İklim Yörüngesi - bu dava genellikle NASA İngilizceyi Metrik birimlere dönüştürmeye çalıştığında ne olacağı olarak belirtilir. Bununla birlikte, gerçekte neyin nakledildiğinin aşırı basit ve zayıf bir temsilidir. Doğru, bir dönüşüm sorunu vardı, ancak tasarım aşamasında yetersiz iletişim gereksinimleri ve yanlış bir doğrulama / onaylama şeması vardı. Ayrıca, iki farklı mühendis, uçuş yörünge verilerinden açıkça belli olduğu için sorunu fark ettiğinde, sorunu bir iletim hatası olduğunu varsaydıkları için uygun seviyeye çıkarmadı. Görev ops ekibi konunun farkında olsaydı, düzeltmek ve görevi kurtarmak için yeterli zaman vardı. Bu durumda, ne olduğunun tanınmaması imkansız bir mantıksal durum vardı, bu da masraflı görevin başarısız olmasına yol açtı.

Mars Polar Lander- bu durum biraz daha az tanınmıştır, ancak Mars İklim Orbiterinin başarısızlığına geçici olarak yakın olmasından dolayı muhtemelen daha utanç vericidir. Bu görevde, yazılım roketin itici destekli inişini Mars yüzeyine kontrol etti. Yüzeyin 40 metre yukarısındaki bir noktada, iniş yapan kişinin bacakları inişe hazırlanırken açıldı. Ayrıca, yazılımın motoru durdurmasını bildirmek için hareket algılayan (çarptıklarında sinyal veren) bacaklarda bir sensör vardı. NASA'nın ne olduğuna dair en iyi tahmin (çünkü birden fazla olası başarısızlık ve eksik veri var) bacaklarda rastgele titreşimlerin aynı anda konuşlandırılmaları nedeniyle aynı anda ve yanlış bir şekilde kapatma mekanizmasının yüzeyin üzerinde 40m yukarı harekete geçmesi ve 110 $ 'ın çökmesine ve tahrip olmasına yol açmasıdır. M uzay aracı. Bu olasılık gelişimde artırıldı, fakat asla ele alınmadı. Sonuçta, yazılım ekibi bu kodun nasıl çalışması gerektiğine dair geçersiz varsayımlarda bulundu (böyle bir varsayım, sahte bir sinyalin, aksine gösteren testlere rağmen, alınamayacak kadar kısa sürdüğü) ve bu varsayımlar sonrasına kadar asla sorgulanmadı. gerçek.

Ek Hususlar

İnsanlarla görüşmek ve değerlendirmek zor bir iştir. Bir adayın araştırmak isteyebileceği bir adayın birkaç boyutu vardır, ancak en önemlilerinden biri bir bireyin eleştirel düşünme yeteneğidir. En azından eleştirel düşüncenin iyi tanımlanmadığı pek çok nedenden ötürü, eleştirel düşünme becerilerini değerlendirmek için çok zor bir zaman geçiriyoruz.

Bir mühendislik eğitmeni olarak, öğrencinin eleştirel düşünme yeteneğini değerlendirmenin en sevdiğim yollarından biri, biraz belirsiz bir soru sormaktı. Daha keskin öğrenciler, sorunun hatalı öncülünü tespit eder, not eder ve öncül verilen cevap ya da tamamen cevap vermeyi reddeder. Genellikle, aşağıdakine benzer bir soru sorardım:

İş yığınınızdan bir çizim alırsınız. Çizim çeşitli farklı bilgiler içerir, ancak en önemlisi yatay bir yüzeye işaret eder ve "Mükemmel derecede düz" der. Yüzeyi 5 "genişliğinde 16" uzunluğunda ve kısmı alüminyumdan yapılmıştır. Bu özelliği yaratacak parçayı nasıl işleyeceksiniz?

(Bu arada, böyle kötü bir spesifikasyonun işyerinde ne sıklıkta göründüğüne şaşıracaksınız.)

Öğrencilerin mükemmel bir özellik yaratmanın mümkün olmadığını ve cevaplarında bunu ifade edeceklerini fark etmelerini bekliyorum. Tasarımcıya geri döneceklerini ve rol yapmadan önce açıklama isteyeceklerini söylerlerse genellikle bir bonus puanı veririm. Eğer bir öğrenci bana .001 düzlemciliğini veya başka bir telafi değerini nasıl elde edeceğini söylerse, sıfır puan alırım. Bu, öğrencilerime daha büyük resmi düşünmeleri gerektiğine dair bir noktaya değinmemde yardımcı oluyor.

Alt çizgi

Bir mühendisle (veya benzer bir mesleğe) röportaj yapıyorsam, eleştirel düşünebilen ve önüne ne koyduğunu sorgulayabilecek birini arıyorum. "Bu mantıklı mı?" Sorusunu soran birisini istiyorum. .

Mükemmel düz bir parça istemek mantıklı değil, çünkü mükemmel diye bir şey yok. Asla yinelenen bir değer vermeyen bir işlev istemek anlamsızdır, çünkü böyle bir garanti vermek imkansızdır. Programlamada sık sık "çöp içeri, çöp dışarı" ifadesini duyarız. Gereksinimler için çöp size verilirse, gerçek niyeti ortaya çıkarmanıza yardımcı olacak soruları durdurmak ve sormak etik sorumluluğunuzdur. Eğer bir adayla röportaj yapıyorsam ve onlara belirsiz bir şart verirsem, açıklama soruları bekleyeceğim.


5

Benzersizliği garanti etmek zordur, çünkü bilgisayarların sonsuz büyük değişkenleri yoktur. Hiçbir gerçek dünya Turing makinesi yapamaz.

Gördüğüm gibi burada iki sorun var ve her ikisinin de köklü çözümleri var.

  • Eşzamanlılık. Birden fazla makine aynı anda bir değere ihtiyaç duyabilir. Neyse ki, modern CPU'lar eşzamanlılık yerleşikine sahiptir ve bazı diller bu avantajdan yararlanmak için geliştirici dostu olanaklar sağlar.
  • Teklik. Benzersizliği garanti etmek imkansız olsa da, gerçek dünyadaki bir sistemin tüm benzersiz değerleri tüketme konusunda çok zor bir zaman alacağı şekilde, değerleri o kadar büyük tutabilen keyfi olarak büyük değişkenlere sahip olabiliriz.

İşte Java'daki çözümüm:

public class Foo {
  private static BigInteger value = BigInteger.ZERO;
  private static final Lock lock = new ReentrantLock();

  public static BigInteger nextValue() {
    try {
      lock.lock();
      value = value.add(BigInteger.ONE);
      return value;
    }
    finally {
      lock.unlock();
    }
  }
}

BigInteger isteğe bağlı bir tamsayı türüdür. Sonsuz olmasa bile, oldukça büyük değerleri tutmak için büyüyebilir. Kilit eşzamanlılık sağlar, böylece aynı değer ayrı iş parçacıkları tarafından sunulan iki eşzamanlı istek tarafından iki kez döndürülemez.


Kodun yalnızca beş yüz yıldan daha az bir süre kullanılacağı varsayımı geçerli bir varsayımdır. 64bit depolamada yalnızca artan değerleri döndürürseniz, bir süre için sorun olmaz. 584555 yıllarında, bizlere 1 çağrı.
Mooing Duck

1
En azından Java'da, bu 2 ^ 63 değerdir (bu yüzden bu yarı yarıya). Birbirimizi öldürme eğilimimiz göz önüne alındığında, insan ırkından daha uzun sürecek olan muhtemel. Ne olursa olsun, daha teorik bir yaklaşım benimsedim. Gerçekçi olarak, 64 (veya 63) bit yeterli olacaktır.

1
@Snowman: NE? Çözümünüz sadece 250.000 yıl boyunca geçerlidir?!?!? SONRAKİ ADAYLAR !!!!!! :-)
Bob Jarvis - Monica

0

Fonksiyonu sunucudaki bir port üzerinden göstereceğim; işlevi çağırmak için, istekte bulunan makine bir bağlantı ister ve aynı zamanda bir tanımlayıcı kod (basitlik için sıralı sayı) tahsis edilirken bir tane verilir. Benzersiz bir değer isteyen bağlantı noktasına bir mesaj gönderildiğinde, değer, geçerli tarih ve saatteki MD5 karma değerini, tanımlayıcı kodun MD5 karma değeriyle birleştirerek oluşturulur.

Kurşun geçirmez bir çözüm istiyorlarsa, her şey hakkında belirsiz olmak yerine gerçek gereksinimlerini belirtmek zorunda kalacaklardı.


-1
string uniq(string machine_id) 
{
   static long u = long.MinValue;
   Interlocked.Increment(ref u);

   //Time stamp with millisecond precison
   string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff",
                                            CultureInfo.InvariantCulture);

   return machine_id + "-" + timestamp + "-" + u;
}

Yukarıdaki şekilde, yeniden başlatma olsa bile veya farklı makinelerden aynı anda çağrılsa bile, dönüş değerinin farklı olduğundan emin olabiliriz.


Programcılar olduğu konusunda kavramsal soruları ve cevapları şeyleri açıklamak bekleniyor. Açıklama yerine kod dökümlerini atmak, kodu IDE'den beyaz tahtaya kopyalamak gibidir: tanıdık gelebilir ve hatta bazen anlaşılabilir görünebilir, ancak garip ... sadece garip geliyor. Beyaz Tahta derleyici yok
gnat

İşaretlediğiniz için teşekkür ederiz, çözümü bir dahaki sefere açıklamaya özen göstereceğiz
techExplorer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.