고유 한 임의의 생성 생성
예를 들어 MSDN 라이브러리에서 생성되는 것과 같은 임의의 고유 한 공유를 생성하고 싶습니다. ( 오류 개체 ). 't9zk6eay'와 같은 잎이 생성되어야합니다.
Guid를 사용하는 것은 꽤 좋은 방법이지만 예제와 같은 것을 찾으려면 아마도 Base64로 변환하고 싶을 것입니다.
Guid g = Guid.NewGuid();
string GuidString = Convert.ToBase64String(g.ToByteArray());
GuidString = GuidString.Replace("=","");
GuidString = GuidString.Replace("+","");
예제에 좀 더 가까워 지도록 "="및 "+"를 제거합니다. 명명되지 않은 후에 "=="가 표시되고 중간에 "+"가 표시됩니다. 다음은 행렬의 예입니다.
"OZVV5TpP4U6wJthaCORZEQ"
2016 년 1 월 23 일 업데이트
이 답변이 유용 생각할 때 내가 게시 한 간단한 (~ 500 SLOC) 암호 생성 라이브러리에 관심이있을 수 있습니다 .
Install-Package MlkPwgen
그런 다음 아래 답변과 같이 임의의 호스트를 생성 할 수 있습니다.
var str = PasswordGenerator.Generate(length: 10, allowed: Sets.Alphanumerics);
한 가지의 라이브러리 장점은 코드가 더 잘 분해되어 문자열을 생성하는을 구석으로보다 더 안전한 임의성 을 사용할 수 있다는을 구석으로 입니다. 체크 아웃 프로젝트 사이트를 자세한 내용은.
원래 답변
아직 아무도 보안 코드를 제공하지 않기 때문에 누군가 유용 할 생각 다음을 게시합니다.
string RandomString(int length, string allowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") {
if (length < 0) throw new ArgumentOutOfRangeException("length", "length cannot be less than zero.");
if (string.IsNullOrEmpty(allowedChars)) throw new ArgumentException("allowedChars may not be empty.");
const int byteSize = 0x100;
var allowedCharSet = new HashSet<char>(allowedChars).ToArray();
if (byteSize < allowedCharSet.Length) throw new ArgumentException(String.Format("allowedChars may contain no more than {0} characters.", byteSize));
// Guid.NewGuid and System.Random are not particularly random. By using a
// cryptographically-secure random number generator, the caller is always
// protected, regardless of use.
using (var rng = System.Security.Cryptography.RandomNumberGenerator.Create()) {
var result = new StringBuilder();
var buf = new byte[128];
while (result.Length < length) {
rng.GetBytes(buf);
for (var i = 0; i < buf.Length && result.Length < length; ++i) {
// Divide the byte into allowedCharSet-sized groups. If the
// random value falls into the last group and the last group is
// too small to choose from the entire allowedCharSet, ignore
// the value in order to avoid biasing the result.
var outOfRangeStart = byteSize - (byteSize % allowedCharSet.Length);
if (outOfRangeStart <= buf[i]) continue;
result.Append(allowedCharSet[buf[i] % allowedCharSet.Length]);
}
}
return result.ToString();
}
}
.NET Core에서 코드를 작동시키는 방법을 알려준 Ahmad에게 감사드립니다.
GUID는 임의의 숫자 가 아니라는 점에주의해야 합니다 . 무작위로 예상되는 것이 완전히 생성하기위한 기초로 사용되는 것을 완전히 생성합니다 ( http://en.wikipedia.org/wiki/Globally_Unique_Identifier 참조 ).
WinAPI GUID 생성기의 암호 분석은 V4 GUID의 시퀀스가 의사 랜덤이기 때문에 초기 상태가 주어지면 UuidCreate 함수에서 반환 된 다음 250,000 개의 GUID를 예측할 수 있음을 보여줍니다. 이것이 GUID가 암호화에서, 예를 들어 임의의 키로 사용되어서는 안되는 이유입니다.
대신 C # Random 메서드를 사용하십시오. 다음과 같은 것 ( 코드는 여기에 있음 ) :
private string RandomString(int size)
{
StringBuilder builder = new StringBuilder();
Random random = new Random();
char ch ;
for(int i=0; i<size; i++)
{
ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))) ;
builder.Append(ch);
}
return builder.ToString();
}
GUID는 고유 한 항목 (예 : 데이터베이스의 고유 한 파일 이름 또는 키) 을 원할 경우 괜찮지 만 무작위로 지정 하려는 항목 (예 : 암호 또는 암호화 키) 에는 적합하지 않습니다 . 따라서 응용 프로그램에 따라 다릅니다.
편집 . Microsoft는 Random도 그다지 좋지 않다고 말합니다 ( http://msdn.microsoft.com/en-us/library/system.random(VS.71).aspx ) :
예를 들어 임의 암호를 만드는 데 적합한 암호화 보안 난수를 생성하려면 System.Security.Cryptography.RNGCryptoServiceProvider와 같은 System.Security.Cryptography.RandomNumberGenerator에서 파생 된 클래스를 사용합니다.
@Michael Kropats 솔루션을 단순화하고 LINQ-esque 버전을 만들었습니다.
string RandomString(int length, string alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
{
var outOfRange = byte.MaxValue + 1 - (byte.MaxValue + 1) % alphabet.Length;
return string.Concat(
Enumerable
.Repeat(0, int.MaxValue)
.Select(e => RandomByte())
.Where(randomByte => randomByte < outOfRange)
.Take(length)
.Select(randomByte => alphabet[randomByte % alphabet.Length])
);
}
byte RandomByte()
{
using (var randomizationProvider = new RNGCryptoServiceProvider())
{
var randomBytes = new byte[1];
randomizationProvider.GetBytes(randomBytes);
return randomBytes.Single();
}
}
나는 그들이 실제로 무작위라고 생각하지 않지만 내 추측은 그것들이 해시라는 것입니다.
임의의 식별자가 필요할 때마다 일반적으로 GUID를 사용하여 "네이 키드"표현으로 변환합니다.
Guid.NewGuid().ToString("n");
Guid와 Time을 조합 해보십시오.
var randomNumber = Convert.ToBase64String(Guid.NewGuid().ToByteArray()) + DateTime.Now.Ticks;
randomNumber = System.Text.RegularExpressions.Regex.Replace(randomNumber, "[^0-9a-zA-Z]+", "");
VB.net의 Michael Kropats 솔루션
Private Function RandomString(ByVal length As Integer, Optional ByVal allowedChars As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") As String
If length < 0 Then Throw New ArgumentOutOfRangeException("length", "length cannot be less than zero.")
If String.IsNullOrEmpty(allowedChars) Then Throw New ArgumentException("allowedChars may not be empty.")
Dim byteSize As Integer = 256
Dim hash As HashSet(Of Char) = New HashSet(Of Char)(allowedChars)
'Dim hash As HashSet(Of String) = New HashSet(Of String)(allowedChars)
Dim allowedCharSet() = hash.ToArray
If byteSize < allowedCharSet.Length Then Throw New ArgumentException(String.Format("allowedChars may contain no more than {0} characters.", byteSize))
' Guid.NewGuid and System.Random are not particularly random. By using a
' cryptographically-secure random number generator, the caller is always
' protected, regardless of use.
Dim rng = New System.Security.Cryptography.RNGCryptoServiceProvider()
Dim result = New System.Text.StringBuilder()
Dim buf = New Byte(128) {}
While result.Length < length
rng.GetBytes(buf)
Dim i
For i = 0 To buf.Length - 1 Step +1
If result.Length >= length Then Exit For
' Divide the byte into allowedCharSet-sized groups. If the
' random value falls into the last group and the last group is
' too small to choose from the entire allowedCharSet, ignore
' the value in order to avoid biasing the result.
Dim outOfRangeStart = byteSize - (byteSize Mod allowedCharSet.Length)
If outOfRangeStart <= buf(i) Then
Continue For
End If
result.Append(allowedCharSet(buf(i) Mod allowedCharSet.Length))
Next
End While
Return result.ToString()
End Function
CrytpoGraphic 솔루션이없는 이유에 놀랐습니다. GUID는 고유하지만 암호화 적으로 안전하지 않습니다 . 이 Dotnet Fiddle을 참조하십시오.
var bytes = new byte[40]; // byte size
using (var crypto = new RNGCryptoServiceProvider())
crypto.GetBytes(bytes);
var base64 = Convert.ToBase64String(bytes);
Console.WriteLine(base64);
Guid를 앞에 추가하려는 경우 :
var result = Guid.NewGuid().ToString("N") + base64;
Console.WriteLine(result);
더 깨끗한 영숫자 문자열 :
result = Regex.Replace(result,"[^A-Za-z0-9]","");
Console.WriteLine(result);
이것은 다양한 언어로 요청되었습니다. 여기에도 적용 할 수있는 암호에 대한 한 가지 질문 이 있습니다.
URL 단축에 문자열을 사용하려면 생성 된 ID가 이미 사용되었는지 여부를 확인하기 위해 Dictionary <> 또는 데이터베이스 검사가 필요합니다.
소문자 와 대문자 ([a-zA-Z0-9])가 있는 영숫자 문자열을 원하는 경우 빠르고 간단한 솔루션을 위해 Convert.ToBase64String ()을 사용할 수 있습니다.
고유성에 관해서는 생일 문제 를 확인 하여 충돌이 (A) 생성 된 문자열의 길이와 (B) 생성 된 문자열의 수가 주어질 가능성을 계산하십시오.
Random random = new Random();
int outputLength = 10;
int byteLength = (int)Math.Ceiling(3f / 4f * outputLength); // Base64 uses 4 characters for every 3 bytes of data; so in random bytes we need only 3/4 of the desired length
byte[] randomBytes = new byte[byteLength];
string output;
do
{
random.NextBytes(randomBytes); // Fill bytes with random data
output = Convert.ToBase64String(randomBytes); // Convert to base64
output = output.Substring(0, outputLength); // Truncate any superfluous characters and/or padding
} while (output.Contains('/') || output.Contains('+')); // Repeat if we contain non-alphanumeric characters (~25% chance if length=10; ~50% chance if length=20; ~35% chance if length=32)
이것은 나를 위해 완벽하게 작동합니다.
private string GeneratePasswordResetToken()
{
string token = Guid.NewGuid().ToString();
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(token);
return Convert.ToBase64String(plainTextBytes);
}
- Microsoft의 링크가 무작위로 생성되었는지 확실하지 않음
- new Guid (). ToString () 살펴보기
public static string GetUniqueKey(int length)
{
string guidResult = string.Empty;
while (guidResult.Length < length)
{
// Get the GUID.
guidResult += Guid.NewGuid().ToString().GetHashCode().ToString("x");
}
// Make sure length is valid.
if (length <= 0 || length > guidResult.Length)
throw new ArgumentException("Length must be between 1 and " + guidResult.Length);
// Return the first length bytes.
return guidResult.Substring(0, length);
}
참고 URL : https://stackoverflow.com/questions/730268/unique-random-string-generation
'IT' 카테고리의 다른 글
varchar () 열을 특정 값으로 제한 하시겠습니까? (0) | 2020.09.09 |
---|---|
단위 테스트는 얼마나 깊습니까? (0) | 2020.09.08 |
UIPageViewController : 현재 보이는 뷰를 반환 (0) | 2020.09.08 |
목록의 표준 표준 (0) | 2020.09.08 |
Gmail 및 NodeJS를 사용하는 Nodemailer (0) | 2020.09.08 |