Ignore:
Timestamp:
Dec 16, 2009, 5:55:00 PM (12 years ago)
Author:
Matthäus Wander
Message:

P2P:

  • implemented Equals and GetHashCode in PeerId
  • changed accessibility of PeerId variables to private -> lead to some refactoring
  • changed PeerId constructor to read ID from p@p OverlayAddress
  • added wrapper methods to retrieve OverlayAddress by byte[] id from p@p

Became some more complex than expected. It compiles and I hope it still works.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/PeerToPeerBase/PeerToPeerBase.cs

    r980 r1022  
    272272        {
    273273            sPeerName = this.linkmanager.UserName;
    274             PeerId pid = new PeerId(this.overlay.LocalAddress.ToString(), this.overlay.LocalAddress.ToByteArray());
    275             return pid;
     274            return new PeerId(this.overlay.LocalAddress);
     275        }
     276
     277        /// <summary>
     278        /// Construct PeerId object for a specific byte[] id
     279        /// </summary>
     280        /// <param name="byteId">overlay address as byte array</param>
     281        /// <returns>corresponding PeerId for given byte[] id</returns>
     282        public PeerId GetPeerID(byte[] byteId)
     283        {
     284            return new PeerId(overlay.GetAddress(byteId));
    276285        }
    277286
     
    299308        public void SendToPeer(string sData, PeerId destinationPeerId)
    300309        {
    301             SendToPeer(sData, destinationPeerId.byteId);
     310            SendToPeer(sData, destinationPeerId.ToByteArray());
    302311        }
    303312
    304313        public void SendToPeer(PubSubMessageType msgType, PeerId destinationAddress)
    305314        {
    306             SendToPeer(((int)msgType).ToString(), destinationAddress.byteId);
     315            SendToPeer(((int)msgType).ToString(), destinationAddress.ToByteArray());
    307316        }
    308317
     
    311320            if (OnP2PMessageReceived != null)
    312321            {
    313                 PeerId pid = new PeerId(e.Message.Source.ToString(), e.Message.Source.ToByteArray());
     322                PeerId pid = new PeerId(e.Message.Source);
    314323                OnP2PMessageReceived(pid, e.Message.Data.PopUTF8String());
    315324            }
     
    340349            if (OnP2PMessageReceived != null)
    341350            {
    342                 PeerId pid = new PeerId(e.Source.ToString(), e.Source.ToByteArray());
     351                PeerId pid = new PeerId(e.Source);
    343352                OnP2PMessageReceived(pid, e.Data.PopUTF8String());
    344353            }
     
    630639    public class PeerId
    631640    {
    632         public string stringId;
    633         public byte[] byteId;
    634 
    635         public PeerId(string sPid, byte[] byPid)
    636         {
    637             this.stringId = sPid;
    638             this.byteId = byPid;
    639         }
    640 
    641         public void Dispose()
    642         {
    643             this.byteId = null;
    644             this.stringId = String.Empty;
    645         }
    646 
    647        
     641        private readonly string stringId;
     642        private readonly byte[] byteId;
     643
     644        private const uint OFFSET_BASIS = 2166136261;
     645        private const uint PRIME = 16777619; // 2^24 + 2^8 + 0x93
     646        private readonly int hashCode;
     647
     648        public PeerId(OverlayAddress oAddress)
     649        {
     650            this.stringId = oAddress.ToString();
     651            this.byteId = oAddress.ToByteArray();
     652
     653            // FNV-1 hashing
     654            uint fnvHash = OFFSET_BASIS;
     655            foreach (byte b in byteId)
     656            {
     657                fnvHash = (fnvHash * PRIME) ^ b;
     658            }
     659            hashCode = (int)fnvHash;
     660        }
     661
     662        /// <summary>
     663        /// Returns true when the byteId content is identical
     664        /// </summary>
     665        /// <param name="right"></param>
     666        /// <returns></returns>
     667        public override bool Equals(object right)
     668        {
     669            /* standard checks for reference types */
     670
     671            if (right == null)
     672                return false;
     673
     674            if (object.ReferenceEquals(this, right))
     675                return true;
     676
     677            if (this.GetType() != right.GetType())
     678                return false;
     679
     680            // actual content comparison
     681            return this == (PeerId)right;
     682        }
     683
     684        public static bool operator ==(PeerId left, PeerId right)
     685        {
     686            if (left.hashCode != right.hashCode)
     687                return false;
     688
     689            if (left.byteId.Length != right.byteId.Length)
     690                return false;
     691
     692            for (int i = 0; i < left.byteId.Length; i++)
     693            {
     694                // uneven pattern content
     695                if (left.byteId[i] != right.byteId[i])
     696                    return false;
     697            }
     698
     699            return true;
     700        }
     701
     702        public static bool operator !=(PeerId left, PeerId right)
     703        {
     704            return !(left == right);
     705        }
     706
     707        public override int GetHashCode()
     708        {
     709            return hashCode;
     710        }
    648711
    649712        public override string ToString()
     
    655718        {
    656719            return this.byteId;
    657         }
    658 
    659         // not used at present...
    660         public bool Equals(PeerId otherPeerId)
    661         {
    662             if (this.stringId == otherPeerId.stringId)
    663                 return true;
    664             else
    665                 return false;
    666720        }
    667721    }
Note: See TracChangeset for help on using the changeset viewer.