@@ -46,6 +46,8 @@ internal class NameService : INameService {
4646 readonly RandomGenerator random ;
4747 readonly VTableStorage storage ;
4848 AnalyzePhase analyze ;
49+
50+ readonly HashSet < string > identifiers = new HashSet < string > ( ) ;
4951 readonly byte [ ] nameId = new byte [ 8 ] ;
5052 readonly Dictionary < string , string > nameMap1 = new Dictionary < string , string > ( ) ;
5153 readonly Dictionary < string , string > nameMap2 = new Dictionary < string , string > ( ) ;
@@ -128,17 +130,7 @@ void IncrementNameId() {
128130 }
129131 }
130132
131- public string ObfuscateName ( string name , RenameMode mode ) {
132- if ( string . IsNullOrEmpty ( name ) )
133- return string . Empty ;
134-
135- if ( mode == RenameMode . Empty )
136- return "" ;
137- if ( mode == RenameMode . Debug )
138- return "_" + name ;
139-
140- byte [ ] hash = Utils . Xor ( Utils . SHA1 ( Encoding . UTF8 . GetBytes ( name ) ) , nameSeed ) ;
141-
133+ string ObfuscateNameInternal ( byte [ ] hash , RenameMode mode ) {
142134 switch ( mode ) {
143135 case RenameMode . Empty :
144136 return "" ;
@@ -148,32 +140,52 @@ public string ObfuscateName(string name, RenameMode mode) {
148140 return Utils . EncodeString ( hash , letterCharset ) ;
149141 case RenameMode . ASCII :
150142 return Utils . EncodeString ( hash , asciiCharset ) ;
151- case RenameMode . Decodable : {
152- if ( nameMap1 . ContainsKey ( name ) )
153- return nameMap1 [ name ] ;
143+ case RenameMode . Decodable :
154144 IncrementNameId ( ) ;
155- var newName = Utils . EncodeString ( hash , alphaNumCharset ) ;
156- nameMap2 [ newName ] = name ;
157- nameMap1 [ name ] = newName ;
158- return newName ;
159- }
160- case RenameMode . Sequential : {
161- if ( nameMap1 . ContainsKey ( name ) )
162- return nameMap1 [ name ] ;
145+ return Utils . EncodeString ( hash , alphaNumCharset ) ;
146+ case RenameMode . Sequential :
163147 IncrementNameId ( ) ;
164- var newName = Utils . EncodeString ( nameId , alphaNumCharset ) ;
165- nameMap2 [ newName ] = name ;
166- nameMap1 [ name ] = newName ;
167- return newName ;
168- }
169- case RenameMode . Reversible : {
170- if ( reversibleRenamer == null )
171- throw new ArgumentException ( "Password not provided for reversible renaming." ) ;
172- var newName = reversibleRenamer . Encrypt ( name ) ;
173- return newName ;
174- }
148+ return Utils . EncodeString ( nameId , alphaNumCharset ) ;
149+ default :
150+
151+ throw new NotSupportedException ( "Rename mode '" + mode + "' is not supported." ) ;
175152 }
176- throw new NotSupportedException ( "Rename mode '" + mode + "' is not supported." ) ;
153+ }
154+
155+ public string ObfuscateName ( string name , RenameMode mode ) {
156+ string newName = null ;
157+
158+ if ( string . IsNullOrEmpty ( name ) )
159+ return string . Empty ;
160+
161+ if ( mode == RenameMode . Empty )
162+ return "" ;
163+ if ( mode == RenameMode . Debug )
164+ return "_" + name ;
165+ if ( mode == RenameMode . Reversible ) {
166+ if ( reversibleRenamer == null )
167+ throw new ArgumentException ( "Password not provided for reversible renaming." ) ;
168+ newName = reversibleRenamer . Encrypt ( name ) ;
169+ return newName ;
170+ }
171+
172+ if ( nameMap1 . ContainsKey ( name ) )
173+ return nameMap1 [ name ] ;
174+
175+ byte [ ] hash = Utils . Xor ( Utils . SHA1 ( Encoding . UTF8 . GetBytes ( name ) ) , nameSeed ) ;
176+ for ( int i = 0 ; i < 100 ; i ++ ) {
177+ newName = ObfuscateNameInternal ( hash , mode ) ;
178+ if ( ! identifiers . Contains ( newName ) )
179+ break ;
180+ hash = Utils . SHA1 ( hash ) ;
181+ }
182+
183+ if ( ( mode & RenameMode . Decodable ) != 0 ) {
184+ nameMap2 [ newName ] = name ;
185+ nameMap1 [ name ] = newName ;
186+ }
187+
188+ return newName ;
177189 }
178190
179191 public string RandomName ( ) {
@@ -185,10 +197,12 @@ public string RandomName(RenameMode mode) {
185197 }
186198
187199 public void SetOriginalName ( object obj , string name ) {
200+ identifiers . Add ( name ) ;
188201 context . Annotations . Set ( obj , OriginalNameKey , name ) ;
189202 }
190203
191204 public void SetOriginalNamespace ( object obj , string ns ) {
205+ identifiers . Add ( ns ) ;
192206 context . Annotations . Set ( obj , OriginalNamespaceKey , ns ) ;
193207 }
194208
0 commit comments