81 lines
2.1 KiB
C#
81 lines
2.1 KiB
C#
// Copyright (c) .NET Foundation. All rights reserved.
|
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
|
|
using System.Text;
|
|
|
|
namespace Microsoft.AspNetCore.Session
|
|
{
|
|
// Keys are stored in their utf-8 encoded state.
|
|
// This saves us from de-serializing and re-serializing every key on every request.
|
|
internal class EncodedKey
|
|
{
|
|
private string _keyString;
|
|
private int? _hashCode;
|
|
|
|
internal EncodedKey(string key)
|
|
{
|
|
_keyString = key;
|
|
KeyBytes = Encoding.UTF8.GetBytes(key);
|
|
}
|
|
|
|
public EncodedKey(byte[] key)
|
|
{
|
|
KeyBytes = key;
|
|
}
|
|
|
|
internal string KeyString
|
|
{
|
|
get
|
|
{
|
|
if (_keyString == null)
|
|
{
|
|
_keyString = Encoding.UTF8.GetString(KeyBytes, 0, KeyBytes.Length);
|
|
}
|
|
return _keyString;
|
|
}
|
|
}
|
|
|
|
internal byte[] KeyBytes { get; private set; }
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
var otherKey = obj as EncodedKey;
|
|
if (otherKey == null)
|
|
{
|
|
return false;
|
|
}
|
|
if (KeyBytes.Length != otherKey.KeyBytes.Length)
|
|
{
|
|
return false;
|
|
}
|
|
if (_hashCode.HasValue && otherKey._hashCode.HasValue
|
|
&& _hashCode.Value != otherKey._hashCode.Value)
|
|
{
|
|
return false;
|
|
}
|
|
for (int i = 0; i < KeyBytes.Length; i++)
|
|
{
|
|
if (KeyBytes[i] != otherKey.KeyBytes[i])
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
if (!_hashCode.HasValue)
|
|
{
|
|
_hashCode = SipHash.GetHashCode(KeyBytes);
|
|
}
|
|
return _hashCode.Value;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return KeyString;
|
|
}
|
|
}
|
|
}
|